私が知っていることから、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のchar cがクラスAに残された「穴」に収容されることです。
しかし、私を混乱させているのは、メンバーを公開する以下のシナリオです
class A{
public:
int a;
short d;
int b;
char s;
};
class B : public A{
public:
char c;
};
今サイズになります
- Aのサイズ:16
- Bのサイズ:20
この違いの理由が理解できないようです。
1
C ++のクラスのサイズがデータメンバーのパブリック/プライベートステータスに依存するのはなぜですか?-そうではありません。これらはコンパイラに依存する実装の詳細です。
—
PaulMcKenzie
では、どのコンパイラを使用していますか?
—
Romen、
@PaulMcKenzie実際にそうです。標準では、同じアクセス権を持つメンバーがグループ化されることを義務付けているため、変更すると、コンパイラーのパディング戦略が変更されます。
—
NathanOliver
@ NathanOliver-ReinstateMonica、私はそれを知りませんでした。たまたま、関連するセクションへの参照がありますか?
—
R Sahu
@RSahu私の答えを今タイトに入れるためにそれを調べます。
—
NathanOliver