문제

다음 수업을 컴파일하십시오

class Interface
{
  virtual void doIt() = 0;
  virtual ~Interface() = 0;
};

inline Interface::~Interface() {}

사용 gcc -fdump-class-hierarchy.

gcc 방출

Class Interface
   size=4 align=4
   base size=4 base align=4
Interface (0x1a779c0) 0 nearly-empty
    vptr=((& Interface::_ZTV9Interface) + 8u)

"거의 비어"의 중요성은 무엇입니까? 무슨 뜻인가요?

도움이 되었습니까?

해결책

그만큼 C ++ ABI "거의 빈"클래스의 정의와 VTable 구성에 어떤 영향을 미치는지에 대한 흥미로운 토론을 제공합니다.

가상 포인터가 포함되어 있지만 (아마도) 가상베이스를 제외한 다른 데이터는없는 클래스. 특히, It :

  • 제로 폭의 비트 필드 이외의 비 정적 데이터 구성원이 없습니다.
  • 비어 있거나 거의 비어 있거나 가상이 아닌 직접 기본 클래스가 없습니다.
  • 최대 하나의 비가 비자, 거의 빈 직접 기본 클래스가 있으며
  • 비어있는 적절한 기본 클래스는 비어 있고 도덕적으로 가상이 아니라 0이 아닌 오프셋이 없습니다.

나는 거의 빈 가상베이스가 객체 크기, vtable 크기 및 가상 통화 오버 헤드에 미치는 영향을 조사하는 동안이 문제를 해결했습니다.

다른 팁

나는 그것이 "빈"과 구별되는 것이라고 생각합니다. 이는 멤버가없는 클래스를 컴파일하면 얻는 것입니다. "거의 비우기"는 그것이 vtable과 다른 것이 없다는 것을 의미합니다.

C ++에는 "빈베이스 최적화"라는 것이 있습니다. 클래스에 회원이없는 경우 기본 클래스로 사용될 때 공간을 차지할 필요가 없습니다. 이것이 중요한 이유의 예입니다 std::unary_function<T, U>. 쉬운 typedefs 세트를 제공하기 위해 존재합니다. 해당 타이핑은 Functor 클래스의 크기에 기여해서는 안됩니다.

Vtable 포인터가있는 기본 클래스가있는 경우이 포인터는 파생 클래스와 공유 할 수 있습니다. 기본 클래스 후 자체 방법을 추가하는 파생 클래스에 대한 vtable을 만듭니다.

이제 유사한 "추가 오버 헤드 없음"기본 클래스를 달성 할 수 있습니다. 분명히 GCC는 이것을 "거의 빈"이라고 부릅니다.

Vtable, 데이터 필드가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top