2013-08-06 2 views
2

QT는 신호/슬롯 메커니즘에서 서명 정규화 프로세스를 적용한다고 읽었습니다. MOC 생성기는 기본적으로 신호/슬롯에서 const 참조 한정자를 제거하고 값으로 전달합니다.정규화 된 서명으로 얻는 QT의 이점

나는 BIG_DATA라는 큰 데이터 구조를 자주 생성하는 클래스를 가지고 있으며, 다른 클래스는이 데이터 구조가 방출 될 때마다이를 포착해야한다.

struct BIG_DATA 
{ 
    // very big data 
}; 

class DataGenerator 
{ 
    // some methods which generate BIG_DATA 

    signals: 
     void data_updated(const BIG_DATA &); 
}; 

내가 뭘 :

connect(&data_generator_object, SIGNAL(data_updated(const BIG_DATA &)), this, SLOT(catch_new_data(const BIG_DATA &))); 

무엇 QT를 수행합니다

connect(&data_generator_object, SIGNAL(data_updated(BIG_DATA)), this, SLOT(catch_new_data(BIG_DATA))); 

그래서, 여기에 const를 참조 예선을 제거하는 이점은 무엇인가? data_updated 신호의 많은 클라이언트에게 전체 BIG_DATA를 복사하는 오버 헤드로 무엇을할까요?

QT가 포인터 서명을 제거하려고 시도하지 않는 경우 가장 좋은 방법은 생성 된 BIG_DATA 개체에 대한 포인터를 사용하는 것입니다.

+0

'connect'는 함수 선언 또는 함수 호출 (또는 둘 중 일부를 수행하는 엉뚱한 매크로)입니까? 함수 호출처럼 보입니다. 함수 호출에 매개 변수 유형을 넣지 마십시오. '신호'는? –

+0

SIGNAL() 및 SLOT()은 매개 변수를 char 배열로 변환하는 매크로입니다. connect()는 함수 호출입니다. –

답변

2

시그너처 정규화는 신호와 슬롯을 식별하는 데에만 사용됩니다. 즉, 사용할 신호 또는 슬롯을 connect()에게 알리려면 정규화 된 서명을 거기에 전달해야합니다. 그러나 신호와 슬롯의 서명은 그대로 유지됩니다. 직접 연결 (단일 스레드 프로그램의 경우 기본값)을 사용하면 개체가 복사되지 않습니다.

+0

확실한 직접 연결은 단일 스레드 프로그램에 대한 기본값입니까? –

+0

@ BЈовић [자동 연결은 모든 프로그램의 기본값입니다.] (http://qt-project.org/doc/qt-5.1/qtcore/qt.html#ConnectionType-enum), 단일 스레드 컨텍스트에서는 작동합니다 DirectConnection과 완전히 똑같습니다. – cgmb

1

대기중인 연결을 사용하는 경우 구조가 복사됩니다 (this 참조). 당신이 사용하는 정규화 된 신호를 사용하는 경우 연결 사용하는 경우, 당신은 성능 저하를 최소화 할 수 있습니다 지금

은 (see this는) 그대로

조회 먼저 서명을 시도하고, 그 실패하는 경우에만입니다 QMetaObject :: normalizedSignature()가 호출되었습니다.

즉 정규화되지 않은 신호/슬롯 서명을 사용할 때 strcpy()에 대한 비용뿐만 아니라 운명에 따라 실패한 첫 번째 조회 시도에 대해서도 비용을 지불해야합니다. 물론 연결은 일반적으로 시작 중에 수행되며 프로파일 러는 사용자를 표시하지 않지만 정규화되지 않은 서명을 사용하면 조기 비경시의 영역에 단단히 들어갑니다.

그러나 성능이 저하되는 것은 신호를 보낼 때가 아니라 연결을 사용할 때뿐입니다. 그리고 연결은 보통 한 번만 이루어집니다. 그러므로 나는 너무 걱정하지 않을 것이다.

구조 복사를 피하려면 참조를 사용하십시오.

관련 문제