2017-02-12 12 views
2

qt 프레임 워크에서 대부분의 라이브러리 신호와 슬롯은 매개 변수로 포인터를 사용합니다. 내가 포인터 대신 매개 변수로 참조를 취하는 신호 슬롯 "구조체"를 만들면 전체 매개 변수가 일반 C++ 참조처럼 4 바이트 (32 비트 시스템)로 복사됩니까?Qt 신호 및 슬롯 : 참조 인수가 복사됩니까?

참조 매개 변수로 신호/슬롯 메소드를 만들 때 뭔가를 알아 차렸기 때문에이 질문을드립니다. 그 때 내가 connect 일 때 QTCreator의 자동 완성 메커니즘은 포인터 매개 변수와 같은 참조 매개 변수로 나를 암시하지 않습니다. 그는 정기적 인 매개 변수를 통해 나를 암시합니다. 예를 들어

... 
signals: 
    void mySignal(int& parameter); 
private slots: 
    void on_mySignal(int& parameter); 

그때 파라미터 참조 & 추가 그다지 그들과 Qt는 접속 시도 : I 수동으로 변경해야

... 
connect(this, SIGNAL(mySignal(int)), this, SLOT(on_mySignal(int))); 

I는 신호 및 슬롯을 만들 :

connect(this, SIGNAL(mySignal(int&)), this, SLOT(on_mySignal(int&))); 

따라서 궁금한 점은 signal/s 제비? 나는 모든 도움에 감사 할 것입니다.

+1

전제에 결함이 있습니다. 정규 C++ 참조는 객체가 아니기 때문에 크기가 없습니다. 예를 들어'sizeof'를 사용하여 참조 크기를 가져올 수 없습니다. 또한 사용되지 않는 신호/슬롯 구문 사용을 중지해야합니다. 적절한 문법은'connect (this, & Class :: mySignal, this, & Class :: on_mySignal);'이다. 그래서 걱정할 필요가 없다. – nwp

+0

감사합니다. 그러나 주된 질문에 답하기 위해 : 참조와 함께 신호/슬롯을 사용한다면, 복사되는 데이터의 양이 많을까요? – Bremen

+0

'int '를 지정 했더라도'int'의 복사본을 기대합니다. 슬롯의 인수에 할당하고 통과 한 매개 변수가 변경되었는지 확인하여 테스트 할 수 있습니다. – nwp

답변

5

동일한 스레드에서 기본값을 사용하여 참조를 보내고 받으면 아무 복사본도 복사되지 않습니다. 값을 송수신하거나 다른 스레드에 참조를 보내는 것을 포함하여 다른 작업을 수행하면 하나, 둘 또는 세 개의 복사본이 만들어집니다.

어떤 일이 발생하는지는 연결 유형 및 QT가 호출을 통해 참조가 유효하다는 것을 알아야한다는 것을 보증해야합니다. 동일한 스레드에서의 직접 연결은 간단한 함수 호출로 해석되므로 기본 데이터는 거의 발생하지 않습니다. 그러나 대기열에있는 연결은 실제로 호출이 발생할시기를 보장하지 않으므로 QT는 데이터 무결성을 유지하기 위해 복사본을 만듭니다. QT는 스레드 경계를 넘는 신호를 암시 적으로 대기시킵니다.

양쪽에서 값을 전달하는 경우 QT는 기본 객체의 상태에 영향을주지 않도록 데이터를 복사합니다.

자세한 내용은 have a look at this blog post을 참조하십시오.

+1

요한, 너는 맞지 않아. 복사는 스레드에 의존하지 않고 슬롯 연결 유형에 따라 다릅니다. 동일한 스레드 ref 인수에서도 대기열에있는 연결의 경우 복사됩니다. Qt 문서 읽기 : http://doc.qt.io/qt-5/qt.html#ConnectionType-enum –

+0

드미트리, 고마워. 추가 된 설명. – Johan