3

.C++ : Base 클래스 SubObject의 크기를 어떻게 알 수 있습니까?

Here 나는 빈 자료의 최적화를 논의되었고, MSalters이 흥미로운 설명을했다 : 어떤 클래스는 지금까지 는 sizeof (클래스) 빈 여부 == 0을 가질 수

. 그러나 우리는 특별히 크기의 빈 기본 클래스 하위 개체에 대해 말하고 있습니다. 자체 vtable이나 vtable 포인터가 필요하지 않습니다. 일반적인 vtable 포인터의 레이아웃을 0으로 가정합니다. 제로 크기의 기본 클래스 하위 개체가 vtable 포인터를 파생 클래스와 공유하게됩니다. 문제 없습니다 : 어쨌든 이 같아야합니다. 가상 기능 중 상당 부분이 입니다.

제 질문은 구체적으로입니다 : 컴파일러는 빈 클래스를 기본 클래스로 사용하거나 최적화하지 않을 수도 있습니다. 우리는 그것이 실제로 무엇을하는지 어떻게 결정할 것인가?

그리고 일반적으로 기본 클래스 하위 개체의 크기를 어떻게 알 수 있습니까? 기본 하위 객체의 크기는 기본 객체로 사용하는지 여부에 관계없이 동일합니까? 컴파일러는 Empty Base Classes로만 최적화합니까?

.

답변

4

좋은 답변.

MS VC++ 및 G ++ 컴파일러는 사용자가 공부할 수 있도록 클래스 레이아웃을 덤프 할 수 있습니다. VC와

cl.exe /c /d1reportAllClassLayout <source>.cpp

이 사용하는 바로 실행 ++ 클래스와의 vtable 레이아웃 덤프 코드

더 나은 C++ 컴파일러는 객체를 배치하는 방법을 이해하기 위해 나는 등 적절한 레이아웃 객체, vtable을, vbtables을 테스트하기 위해 1990 년에 쓴 메모리에서 http://www.openrce.org/articles/files/jangrayhood.pdf 및 Stan Lippman의 C++ Object Model 내부 책을 즐길 수 있습니다.

해피 해킹!

0

수 없습니다. 기본으로 사용할 때 실제 크기는 sizeof() 정보와 많이 다를 수 있습니다.

EBO 이외의 다른 예로 가상 상속이 있습니다.

class X {}; 
sizeof(X) >= 1 

그러나 사용하지 않을 경우 파생 클래스는이 공간을위한 공간을 할당 할 필요가 없습니다 :

2

객체의 minium 크기는 1

class Y : public X {}; 
sizeof(Y) >= 1 

을 따라서도 불구하고 클래스 X 자체는 상위 클래스로 변환되지 않는 1 바이트를 차지합니다. 따라서 Y의 관점에서 클래스 X는 0 바이트를 차지합니다.

그래서 여기에서는 컴파일러가 기본 클래스를 최적화했다고 말할 수 있습니다 (기술적으로는 아무 것도하지 않았지만 객체의 크기가 0이 아닌 규칙을 적용하면됩니다).

int main() 
{ 
    std::cout << sizeof(X) << ":" << sizeof(Y) << "\n"; 
} 

다음과 같은 출력을 생성합니다 :

> ./a.exe 
1:1 
> 

이유 클래스는 모든 개체의 주소가 고유 수 있도록 제로보다 크기가 더 있어야합니다. 컴파일러가 클래스의 크기를 0으로 설정하면 여러 변수 (객체)가 모두 같은 메모리 주소를 가졌을 가능성이있는 쉬운 버그가 있습니다 (모두 크기가 0 인 경우). 이 잠재적 인 문제를 해결하는 간단한 규칙은 모든 오브젝트가 0이 아닌 크기를 가져야한다는 것입니다.

요약 :

size_of_type(X) = size_of_type(base) + sum(size_of_type(members)) + padding + (extra stuff like vtable pointer etc); 


sizeof(<CLASS>) = min(1, size_of_type(<CLASS>)) 
관련 문제