2013-08-10 6 views
3

1. Derived4 클래스의 크기가 8 바이트를 나타내는 이유는 무엇입니까 ??빈 클래스 및 파생 가상 클래스의 크기

class Empty 
{}; 
class Derived4 : virtual public Empty 
{ 
    char c; 
}; 

2. Derived2 클래스의 크기가 4 바이트를 나타내는 반면에 ??

class Empty 
{}; 
class Derived2 : virtual public Empty 
{}; 
+0

단어 경계에 채우기? 'char' 필드를 추가하면 어떻게됩니까? – millimoose

+0

이것은 구현이 정의되어 있으므로 대답하기가 거의 불가능하지만 어쨌든 왜 신경 씁니까? 내 내기가 될 – nijansen

+0

.vtable은 여분의 4 바이트를 일으키고 있으며 'char'은 총 1 바이트로 끝납니다. 컴파일러는 8 바이트 값으로 작업하기위한 지침에서 8 바이트 의미를 나타냅니다 – Jake

답변

5

sizeof(any_class)은 구현에 따라 정의됩니다.

하지만 실제로 어떤 일이 발생합니까? 음, virtual 상속을 사용하고, 대부분의 구현은, sizeof(pointer) 바이트 (포인터가 파생 클래스 자체에 저장되어있다) 플러스 sizeof의 모든 회원 비용이 기능 (있는 경우)를 구현하는 숨겨진 포인터를 사용, 플러스 패딩 필요한 경우, 기본 클래스 (빈 기본 최적화로 인해 비어있는 기본 클래스의 경우 0으로 줄일 수 있음).

자세한 답변을 보려면 "C++로 패딩"을이 사이트에서 검색하십시오. 당신은 그것에 많은 주제를 발견 할 것이다.

+0

가상 상속의 경우에도 Vptr & Vtable이 그림에 표시됩니까, 나는 그림에 포함 된 것으로 생각합니다. 당신이 Vtable을 필요로 할 때 당신의 클래스 bcz thats .., 명확히하십시오 – GeekPanther

+0

@ GeekPanther : 예. 하나의 가상베이스에 대해 하나의'vptr '. 따라서 두 개의 가상 기본 클래스가 있으면 두 개의 'vptr'이 있고 클래스 크기가 이에 따라 계산됩니다. 빈 기본 클래스의 경우 컴파일러는이를 최적화 할 수 있으므로 두 개가 아닌 한 개만 가질 수 있습니다. – Nawaz

+0

그러면 Vtable의 내용에 Vtable의 내용이 포함될 것입니다. Vfunction의 주소가 들어 있습니다. 가상 상속 (VFunc가없는 경우)의 경우 Vtable의 내용은 무엇입니까? – GeekPanther

2

Derived4 클래스의 크기는 8 바이트입니까? (메모리의 클래스 이름을 나타내는 inorder를) 빈 클래스에 1 바이트를 생성 ++ 32 비트 시스템에서 g

class Empty 
{}; 
class Derived4 : virtual public Empty 
{ 
    char c; 
}; 

. 이것은 의도 한 행동입니다.

당신은 기본적으로 컴파일러에 의해 클래스 Derived4에서 __vptr 변수를 만드는 결과 virtual publicDerived4Empty을 상속합니다. 그래서 클래스 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 변수 Derived4Empty 상속 적용된다. 따라서 Dervied4의 크기는 sizeof(void*)입니다. 이는 32 비트 머신에서 4 바이트 크기에 불과합니다.

+0

분명히 설명했다. – Snehasish

2

빈 클래스가 0 바이트 크기가 아니라 기본 클래스로 사용될 때 Saravanan 문에 추가하면 EBCO (Empty Base Class Optimization) 덕분에 기본 클래스 "overhead"가 제거됩니다.

관련 문제