C++空クラスおよびメンバー変数のないクラスのサイズインスタンス解析

1433 ワード

周知のC++中空クラスのサイズは1であるが,空クラス以外のメンバー変数のないクラスのサイズは,かなりの開発者が不明な点が多い.
ここでは、次のコードを例に挙げます.

#include
using namespace std;
class a {};
class b{};
class c :public a{
virtual void fun() = 0;
};
class d :public b, public c{};
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;
getchar();
return 0;
}


プログラム実行の出力結果は次のとおりです.

sizeof(a)=1
sizeof(b)=1
sizeof(c)=4
sizeof(d)=8


なぜこのような結果になったのでしょうか.初心者は疑問に思うに違いない.クラスa,bは空のクラスなのに、その大きさは0であるべきだ.なぜコンパイラが出力した結果は1なのか.これが私たちがさっき言ったインスタンス化の原因です(空のクラスは同じようにインスタンス化できます).各インスタンスにはメモリにユニークなアドレスがあります.この目的を達成するために、コンパイラは空のクラスに隠しバイトを追加することがよくあります.このように、空のクラスはインスタンス化後にメモリにユニークなアドレスを得たので、a,bのサイズは1です.
クラスcはクラスaから派生し、その中に純粋な虚関数があり、虚関数があるため、虚関数テーブルを指すポインタ(vptr、複数の虚関数は依然として1つのポインタしかない)があり、32ビットのシステムでポインタに割り当てられたサイズは4バイトであるため、最後にcクラスのサイズは4となる.
クラスdの大きさは更に多くの初心者を困惑させて、クラスdはクラスb,cから派生して来て、その大きさは両者の和5であるべきで、どうして8ですか?これは、インスタンスのメモリへのアクセス効率を向上させるために、メモリにデータが整列し、クラスのサイズが4バイトの整数倍に調整されることが多いためです.そして、近い法則をとり、最も近い倍数を大きな方向にとることがクラスの大きさであるため、クラスdの大きさは8バイトである(dが3つの空のクラスとcから派生した場合、依然として8である).