문제
다음 수업을 컴파일하십시오
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, 데이터 필드가 없습니다.