C/C++ , http://blog.csdn.net/dananhai/article/details/1089291, 。
struct class, , , struct/class 。 :
struct align
{
double b;
char c;
int a;
char d;
};
の は、double b に んでいるので、この はdouble(この の で も いデータ )をデータとして わせする で、doubleは8バイトの で、 の きい を し、8の に しなければ、 にバイトから8の を めます.
また、 の データメンバーの アドレスは、 のデータ サイズの でなければならない. の では,bの アドレスを0,cの アドレスを8としたが,aの アドレスは9ではなく,aはintタイプ, きさは4バイトであるため,コンパイラはcの に3バイトを め み,aの アドレスを12とする. に、dの アドレスは16である.
サイズ:
sizeof(align)
8(bの きさ)+4(cの きさに された3バイト)+4(aの きさ)+1(dの きさ)=17,17は8の ではないため、コンパイラは に8の 、すなわち24にバイトを し、この の は
24. の を てみましょう.
struct align
{
char c;
char d;
int a;
double b;
};
バイトの :1(cのサイズ)+1(dのサイズ)+2(バイト )+4(aのサイズ)+8(bのサイズ)=16
い :struct/classのメンバー のサイズを に べて、 さい に に き むと、できるだけメモリスペースを できます.
な :
class/struct のメンバー にはコンテキスト がある があります. するメンバーを して、 とメンテナンスを にすることができます. の でメモリスペースを しないことをお めします. のようになります.
struct product
{
int cdrom_amount;
double cdrom_unit_price;
int phone_amount;
double phone_unit_price;
};
この は、このようなメンバーの に って、 をしないことをお めします.
2.データの わせを する
っているはず #pragma pack(2)の :
#pragma pack(2)
struct align
{
char c;
int a;
double b;
};
#pragma pack()
のようにこの が に2つの わせを すると、その が する は
2+4+8
= 14.ある に して なデータ を した 、データ を する に してください.すなわち、 の に のことを れないでください.
#pragma pack()
また、この を しないでください.メモリのスタックを したり、 に したりするときに できないことが する があります. を む.
は がまとめたものですが、 が けているため、 の が っているところや が なところもあるかもしれません.