2013-03-04 1 views
0

MFC는 가상 함수와 관련된 공간 소비 및 복잡성 문제를 효율적으로 처리합니다. 예를 들어, 아래 이미지는 클래스 계층 구조에서 함수를 가져 오는 방법을 보여줍니다. 이 구현은 공간 효율적이며 이해하기 쉽고 효율적인 것으로 보입니다.MFC MessageMap 및 가상 함수

MFC Message Map Processing

내 질문은, 왜 컴파일러의 복잡성을 줄이고 vtable을 제거하기 위해 같은 방법을 사용하지 않는 코어의 C++? 아마도 이러한 구현에는 효율성 문제도있을 것입니다.

+1

당신이 * vtable을 제거 * 무엇을 의미합니까? MFC 전략은 기본 클래스의 모든 메시지 처리기를 노출하면 전체 계층 구조에 영향을 미치므로 매크로 기반 vtable을 구현하지만 원칙은 동일하게 유지됩니다. –

답변

2

C++ 다형성은 모든 컴파일러에서 거의 동일하게 구현됩니다. 각 객체에는 실제 함수 주소를 얻기 위해 참조 해제되는 vtable (messageEntries과 동일)이 있습니다.

C++ 다형성이 매크로 또는 기타 부도덕 한 작업을 필요로하지 않으므로 MFC보다 이 더 좋음입니다. 유일한 변경은 virtual 키워드이며 나머지 코드는 동일하게 유지됩니다.

사용 편의성은 어떻습니까?

// Compare 
object_ref._messageEntries[WM_PAINT](); // MFC 
// vs. 
object_ref.paint(); // C++ 

효율성과 관련하여 가상 메서드는 다른 포인터를 참조하지 않고 이론적으로는 피할 수 있습니다. 성능이 중요한 코드를 작성할 때는 실행 된 작업 수를 줄이고 런타임 다형성을 모두 덤프하려고합니다. 내장 된 언어 솔루션은 확실히 MFC보다 느리지는 않습니다.

이벤트를 디스패치 할 때 MFC의 솔루션 전문가가 표시합니다. 이 경우 인덱싱 가능 함수 배열을 갖는 것이 큰 이점입니다. 왜냐하면 구성 요소를 통해 이벤트를 전달하기가 쉽기 때문입니다.

1

MFC 클래스를 자세히 살펴보면 많은 가상 메서드가 표시됩니다. 위의 다이어그램에서 보는 것은 많은 GUI 프레임 워크에서 사용되는 메시지 기반 메커니즘입니다. 안드로이드에서 사용되는 것과 같은 새로운 프레임 워크에서도 마찬가지입니다.

메시지 기반 통신의 주요 목적은 모든 GUI 관련 항목이 GUI 스레드에서 수행되고 있는지 확인하는 것입니다. 또한 모든 메시지가 대기중인 상태이므로 어떤 순서로 관리됩니다. 이것은 실제로 C++이 어떻게 디자인 되었는가와 관련이 없습니다.

당신이 다음 WTL/ATL 및 CRTP 들여다 가상 메소드를 사용하지 않는 프레임 워크 보길 원하는 경우

:

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern