가상 함수 호출 최적화에 관한 질문이 있습니다. 어디 선가 읽고 (그리고 문제는 내가 지금 기사를 찾을 수있다)은 다음과 유사한 구조를 사용하여 V-테이블 룩업을 멀리 최적화 할 수있을 것을 :가상 함수 호출의 최적화
// Base.h
class Base
{
public:
virtual void Foo() = 0;
};
// Concrete.h
class Concrete : public Base
{
public:
virtual void Foo()
{
// do something;
}
};
//Some.h
extern Base* const g_object;
// Some.cpp
Concrete on_stack_concrete;
Base* const g_object = &on_stack_concrete;
트릭을 (역동적이 아닌) 스택에 할당 된 변수에 대한 const 포인터를 사용하고 있어야하며, 컴파일러가이를 최적화하는 것이 가장 확실합니다. 그래서 사용자가 g_object-> Foo()를 호출 할 때마다 v-table look-up을 필요로하지 않고 무언가를 수행한다.
사실입니까?
미리 듣기에 감사드립니다.
는EDIT :
이러한 구문의 사용 가능한 구체적인 구현의 인터페이스를 한정한다. 물론 "제한된"방법은 비공개로해야한다고 주장 할 수 있지만 때때로 라이브러리의 다른 모듈은 사용자가 객체를 조작 할 수 없도록 객체의 공용 추가 메서드에 액세스해야합니다. 그래서 # 정의를 사용하여 예를 들어, 하나의 유사한 코드를 생성 할 수 있습니다 :이 클래스의 선언 만 CPP 정의 할 수 있습니다 사실
// Some.cpp
#ifdef _WIN32
Win32Concrete concrete;
#elif defined _UNIX
UnixConcrete concrete;
#endif
Base* const g_global = &concrete;
따라서 파일을 사용자가 자신의 실존을 인식하지 못합니다.
이유는이 처음에는 그러한 상수 포인터를 사용하는 것이 아니라 그러한 시나리오에서 v 테이블 검색을 최적화 할 수 있는지 여부입니다.
아마도 컴파일러에 따라 다르므로 컴파일러에서 생성 한 어셈블리를 확인할 수 있어야합니다. – marcinj
포인터가 항상 같은 개체를 가리키는 경우 포인터를 사용해야하는 이유는 무엇입니까? –
@BoPersson, 나는 단지 하나의 좋은 응용 프로그램을 생각할 수 있습니다. 예를 들어 사용자에게 추상 인터페이스 만 노출하는 크로스 플랫폼 라이브러리와 일부 백엔드는 일부 #define에 따라 다양한 플랫폼에 대한 여러 구현을 사용합니다. 물론 각기 다른 정의를 가진 각 플랫폼에 대해 여러 컴파일을해야하지만 최종 사용자에게는 아무런 차이가 없습니다. –