C++ | class size

12233 ワード

c++クラスサイズはマシンとコンパイラに関係しています.64ビットマシンポインタサイズは8バイト、32ビットマシンは4バイトです.
  • 各インスタンスにはメモリにユニークなアドレスがあります.この目的を達成するために、コンパイラは空のクラスに隠しバイトを追加することがよくあります.このように、空のクラスはインスタンス化された後、メモリにユニークなアドレスを得ます.
  • 虚関数のあるクラスにはvirtual table(虚関数テーブル)があり、そこにはクラスのすべての虚関数が含まれており、クラスにはvirtual table pointersがあり、通常vptrがこのvirtual tableを指している.
  • 複数の親クラスがある場合、複数のダミー関数ポインタが維持されます.最初のベースクラスを指すダミー関数テーブル(クラスで定義されたダミー関数付き)、2番目のポインタが2番目のベースクラスを指すダミー関数テーブル...このように推す.
  • 虚継承、もう1つの親を指すポインタ、このポインタは虚ベースクラスを指すポインタ(Pointer to virtual base class);
  •  1 #include <iostream>
    
     2 
    
     3 using namespace std;
    
     4 
    
     5 class A {};
    
     6 
    
     7 class B {};
    
     8 
    
     9 class C : public A {
    
    10     virtual void func() = 0;
    
    11 };
    
    12 
    
    13 class D : public B, public C {};
    
    14 
    
    15 class E {
    
    16 public:
    
    17     virtual void e() {};    
    
    18 private:
    
    19     char abc[3];
    
    20 };
    
    21 
    
    22 class F : public E {
    
    23 public:
    
    24     virtual void f() {};
    
    25 };
    
    26 
    
    27 class G : virtual public E {};
    
    28 
    
    29 class H {
    
    30 public:
    
    31     virtual void h() {};
    
    32 private:
    
    33     char abc[3];
    
    34 };
    
    35 
    
    36 class I : public E, public H {};
    
    37 
    
    38 class J : virtual public E {};
    
    39 
    
    40 class K : public G, public J {};
    
    41 
    
    42 class L {
    
    43     static int l;
    
    44     static void la() { static int m; }
    
    45 };
    
    46 
    
    47 int main() {
    
    48     cout << "sizeof(A) = " << sizeof(A) << endl; //   ,   1
    
    49     cout << "sizeof(B) = " << sizeof(B) << endl; //   ,   1
    
    50     cout << "sizeof(C) = " << sizeof(C) << endl; //        (64      8   )
    
    51     cout << "sizeof(D) = " << sizeof(D) << endl; //       
    
    52     cout << "sizeof(E) = " << sizeof(E) << endl; //     +      (8 + 8)
    
    53     cout << "sizeof(F) = " << sizeof(F) << endl; //  E
    
    54     cout << "sizeof(G) = " << sizeof(G) << endl; //    ,          ,        +        +      = 24
    
    55     cout << "sizeof(H) = " << sizeof(H) << endl; //  E
    
    56     cout << "sizeof(I) = " << sizeof(I) << endl; //            E H +          = 32
    
    57     cout << "sizeof(J) = " << sizeof(J) << endl; //  G
    
    58     cout << "sizeof(K) = " << sizeof(K) << endl; //       (E)    +            G J +        = 32
    
    59     cout << "sizeof(L) = " << sizeof(L) << endl; //         
    
    60     return 0;
    
    61 }

    出力:
     1 sizeof(A) = 1
    
     2 sizeof(B) = 1
    
     3 sizeof(C) = 8
    
     4 sizeof(D) = 8
    
     5 sizeof(E) = 16
    
     6 sizeof(F) = 16
    
     7 sizeof(G) = 24
    
     8 sizeof(H) = 16
    
     9 sizeof(I) = 32
    
    10 sizeof(J) = 24
    
    11 sizeof(K) = 32
    
    12 sizeof(L) = 1