C++클래스 의 크기 를 깊이 분석 합 니 다.

2954 단어 C++클래스 크기
먼저 예 를 들 어

#include <iostream>
 using namespace std;

 class A{};

 class B
 {
     int b;
     char c;
 };

 class C
 {
     int c1;   
     static int c2;
 };
 int C::c2 = 1;

 class D:public C,public B{
     int d;
 };
 int main()
 {
     cout<<"sizeof(A)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }
운행 결 과 는 다음 과 같다.
sizeof(A)=1
sizeof(B)=8
sizeof(C)=4
sizeof(D)=16
클래스 A 의 경우 A 는 빈 클래스 이지 만 빈 클래스 를 예화 하기 위해 컴 파일 러 는 바이트 하 나 를 할당 합 니 다.그러면 A 를 예화 한 후에 메모리 에 유일한 주소 가 있 습 니 다.클래스 B 에 대해 B 의 크기 는 size of(int)+size of(char)=5 여야 합 니 다.그러나 메모리 정렬 을 고려 하면 B 의 크기 는 8.클래스 C 여야 합 니 다.클래스 의 정적 구성원 변 수 는 전역 에 놓 여 있 고 클래스 의 일반 구성원 과 함께 놓 여 있 지 않 습 니 다.클래스 의 정적 구성원 이 선언 된 후에 이미 존재 합 니 다.정적 구성원 이 아 닌 클래스 가 실례 화 된 후에 만 존재 합 니 다.그래서 C 의 크기 는 sizeof(int)=4 입 니 다.D 의 크기 는 B+C 의 크기+자체 데이터 멤버 의 크기 로 모두 16 입 니 다.
 
==============================분할 선 은 여기 있다===============================================
다음은 가상 함 수 를 포함 하 는 클래스 의 크기 를 토론 합 니 다.

#include <iostream>
 using namespace std;

 class A
 {
 public:
     void virtual aa(){};
 };

 class B:public A
 {
     void virtual bb(){};
 };

 class C:virtual A
 {
 public:
     void virtual aa(){};
     void cc(){};
 };

 class D:virtual A
 {
 public:
     void virtual dd(){};
 };

 int main()
 {
     cout<<"sizeof(A)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }
실행 결 과 는 다음 과 같 습 니 다.
sizeof(A)=4
sizeof(B)=4
sizeof(C)=8
sizeof(D)=12
class A 에 대해 서 는 가상 함 수 를 포함 하고 있 습 니 다.컴 파일 러 는 가상 함수 에 대해 가상 함수 표를 생 성하 여 해당 하 는 함수 주 소 를 기록 합 니 다.이 를 위해 class A 의 메모리 주소 에 vfptr 가 있어 야 합 니 다.A 포인터 가 이 가상 시 계 를 가리 키 기 때문에 class A 의 크기 는 포인터 크기,즉 4 입 니 다.
class B 에 대해 서 는 Public 계승 A 입 니 다.비록 그것 도 하나의 가상 함수 가 있 지만 결 과 를 보면 B 와 A 는 모두 B 의 vtable(가상 표)에 있어 야 하기 때문에 class B 의 크기 는 4 입 니 다.
class C 에 대해 서 는 vitual 계승 A 이기 때문에 부모 클래스 A 를 가리 키 는 지침 이 있어 야 합 니 다.4 바이트 크기 aa()는 class A 를 계승 하 는 가상 함수 입 니 다.결 과 를 보면 메모리 에 공간 을 차지 하지 않 았 기 때문에 C 의 크기 는 size of(A)+4=8 입 니 다.
class D 에 대해 서 는 가상 계승 class A 입 니 다.같은 위 에 부모 클래스 A 를 가리 키 는 지침 이 있어 야 합 니 다.동시에 class D 에 가상 함수 가 있어 야 하기 때문에 가상 시 계 를 가리 키 는 지침 이 있어 야 합 니 다.그래서 size of(D)=size of(A)+4+4=12

좋은 웹페이지 즐겨찾기