내가 아는 것에서 C ++의 클래스 크기는 아래 요인에 따라 다릅니다.
- 모든 비 정적 데이터 멤버의 크기
- 데이터 멤버의 순서.
- 바이트 패딩이 사용 가능한지 여부
- 바로 기본 클래스의 크기입니다.
- 가상 기능의 존재.
- 상속 모드 (가상 상속).
이제 아래와 같이 2 개의 클래스를 만들었습니다.
class A{
int a;
short s;
int b;
char d;
};// kept a char at last on purpose to leave a "hole"
class B : public A{
char c;
};
이제 A와 BI의 크기를 확인하십시오.
- A의 크기 : 16
- B 사이즈 : 16
내 가정은 클래스 B의 문자 c가 클래스 A의 “구멍”에 수용된다는 것입니다.
그러나 나를 혼란스럽게하는 것은 회원을 공개하는 아래 시나리오입니다.
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
이제 크기는
- A의 크기 : 16
- B의 크기 : 20
이 차이의 이유를 이해할 수없는 것 같습니다.
답변
Itanium ABI 는 POD의 C ++ 03 정의를 사용하여 “레이아웃을위한 POP”인 클래스를 정의합니다. 개인 데이터 멤버가 있으면 클래스가 C ++ 03의 집계 및 POD가 될 수 없습니다.
POD-구조체 형 비 POD-구조체 비 POD-조합 (또는 유형의 배열) 또는 기준의 어떠한 비 정적 데이터 멤버가없는 집합 클래스 없으며 사용자 정의 복사 할당 연산자가없고 아무런 사용자 정의 소멸자.
POD 클래스이므로 테일 패딩 재사용이 비활성화됩니다 .
이러한 유형의 dsize, nvsize 및 nvalign은 일반적인 크기 및 정렬로 정의됩니다. 이러한 속성은 기본 클래스로 사용되는 비어 있지 않은 클래스 유형에만 중요합니다. 우리는 표준의 초기 버전이 다른 어떤 용도로도 그것을 사용할 수 없었고 때로는 더 빠른 유형의 복사를 허용하기 때문에 POD에 대한 테일 패딩을 무시합니다.
따라서 첫 번째 예에서는 A
레이아웃 목적으로 POD가 아니고 테일 패딩을 사용할 수 B::c
있지만 두 번째 예에서는 POD이며 테일 패딩을 재사용 할 수 없습니다.