C/C++データ境界整列の注意

2072 ワード

 
  
 

( CSDN , )

C/C++ , http://blog.csdn.net/dananhai/article/details/1089291, 。

1.

, , 。
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()

また、この を しないでください.メモリのスタックを したり、 に したりするときに できないことが する があります. を む.
は がまとめたものですが、 が けているため、 の が っているところや が なところもあるかもしれません.