私は、コンパイラがいくつかのパディングバイトを構造体に追加するかもしれないことを知っています。しかし、コンパイラが構造体内の変数から読み取ったことがないことがわかると、構造体のサイズがメンバーの合計サイズよりも小さくなる可能性はありますか?structは、そのコンポーネントの合計よりも小さくすることはできますか?
struct Foo_T
{
int a;
intmax_t b;
};
void bar(void)
{
struct Foo_T foo;
foo.a=rand();
someFunction(foo.a);
//i never access foo.b, only foo.a
if(sizeof(foo)< sizeof(int)+sizeof(intmax_t))
{
//is it possible that we can end here?
}
}
コンパイラがいくつかのパディングを追加したり、かなりの最適化を行うことは可能ですが、構造体のメンバーを削除することはできません。これは、特に構造を外部関数に渡す場合には、非常に難しいことです。 –
この便利なトピックを読む:http://stackoverflow.com/questions/9486364/why-cant-c-compilers-rearrange-struct-members-to-eliminate-alignment-padding – Fefux
C++でコンパイラは空のベースはできませんサイズは0ですが、派生クラスでは空のベースを切り捨てることができるため、子クラスのサイズはベースの合計サイズとそれ自身のデータよりも小さくなります –