왜 Derived4
클래스의 크기는 8 바이트입니까? (메모리의 클래스 이름을 나타내는 inorder를) 빈 클래스에 1 바이트를 생성 ++ 32 비트 시스템에서 g
class Empty
{};
class Derived4 : virtual public Empty
{
char c;
};
. 이것은 의도 한 행동입니다.
당신은 기본적으로 컴파일러에 의해 클래스 Derived4
에서 __vptr
변수를 만드는 결과 virtual public
로 Derived4
에 Empty
을 상속합니다. 그래서 클래스 Derived4
이 같은,
class Derived4 {
void* __vptr; // 4 bytes
char c; // 4 bytes as 1 char + 3 for structure padding
};
8 바이트 위 클래스의 그래서 크기를 보이는 것, 난 당신이 동의 바랍니다.
Derived2
클래스의 크기가 4 바이트를 나타내지 만?
class Empty
{};
class Derived2 : virtual public Empty
{};
여기서 동일한 원리 빈 클래스 1 바이트 가상 결과로서 Derived4
클래스에 삽입 __vptr
변수 Derived4
에 Empty
상속 적용된다. 따라서 Dervied4
의 크기는 sizeof(void*)
입니다. 이는 32 비트 머신에서 4 바이트 크기에 불과합니다.
단어 경계에 채우기? 'char' 필드를 추가하면 어떻게됩니까? – millimoose
이것은 구현이 정의되어 있으므로 대답하기가 거의 불가능하지만 어쨌든 왜 신경 씁니까? 내 내기가 될 – nijansen
.vtable은 여분의 4 바이트를 일으키고 있으며 'char'은 총 1 바이트로 끝납니다. 컴파일러는 8 바이트 값으로 작업하기위한 지침에서 8 바이트 의미를 나타냅니다 – Jake