ユニオンメモリの位置合わせ

1653 ワード

union DATE { char a; int i[5]; double b; };



DATE max;



cout<< sizeof(max) << endl;

この質問はよく答えて、私はこの質問を基本的な概念問題(入門書で紹介しなければならない)にまとめました.一般的には、メモリ管理をしたことがあるので、この言語の特性に慣れていないと思います.The C Programming Languageの中でこの問題の原語をいくつか取って、読書がまだ必要であることを説明します:1連合は1つの構造で、2そのすべてのメンバーはベースアドレスに対するオフセット量が0で、3この構造空間は最も「広い」メンバーを収容するのに十分な大きさで、4そして、その位置合わせの方式は連合の中のすべてのタイプのメンバーに適しています.一部の兄弟はまだ分からないのではないかと心配しています.
 
char a;
=>
x
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
int i[5];
=>
 x
 x
 x
 x
 x
x
double b;
=>
 x
 
 
この構造はint i[5]を置くには少なくとも4を占めなければならない.×5=20バイトです.doubleがない場合は20バイトで十分ですが、この場合は4バイトで揃えます.ただし、doubleを追加するにはdoubleの位置合わせを考慮する必要があります.doubleは8バイトで位置合わせされているので、8を満たすために4バイトを追加する必要があります.×3=24、つまり8の倍数でなければならないので、24という数字が出てきます.以上のように、最終的な連合体の最小sizeも、含まれるすべてのタイプの基本長の最小公倍数である.(ここでのバイト数はwintの下の値を指し、プラットフォームやコンパイラによって値が異なる場合があります.)