以下是引用我菜119在2010-11-30 18:31:25的发言:
vc++中的编译器默认的对齐字节数是8个字节,那么变量是按照一个什么样的方式存储在内存中的呢??是按照有效对齐字节数存储的,什么是有效内存对齐字节数呢?即指定的内存对齐字节数与自身的内存对齐字节数二者之间取小,比如下面这个结构体:
struct abc
{
int a;
char rfu; /*预留字节*/
char b[3] ;
float c;
double d;
} i , j;
int a的有效内存对齐字节数是4(编译器默认的是8,而a自身内存对齐字节数是4 ,二者取小就是4 ) ,那么对于a来说就必须要对齐到内存地址值是4的倍数的地址上,同样的道理char rfu 的内存对齐字节数是1 ,float c内存对齐字节数是8 , double d内存对齐字节数也是8 ; 对于char b[3]这个char类型的数组来说它的对齐是按照char类型的有效对齐字节数对齐也就是对齐到地址值是1的倍数的地址上(也就是任意的地址上),
假设从地址00开始存储的话:
那么这个结构体的内存存储形式是:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 (地址是十六进制的)
a rfu b[0] b[1] b[2] c d
最后还要保证这个结构体也要对齐,结构体的内存对齐字节数是该结构体成员中的有效内存对齐字节数与默认的内存对齐字节数中取大的那个,也就是8 ,整个结构体的字节数是24 ,正好能够被8圆整!因此这个结构体的字节数是24 !
这个地方我加入了 char rfu;刚好能使最后的整个结构体字节数为24,要是去掉这个,也就是说最后的整个结构体的字节数不为结构体成员中的有效内存对齐字节数中取大的那个的整数倍,那从哪里补齐呢?是在最后,也就是d后面会自动补上一个char类型吗?
最后,感谢119的回答,但是如果你说话能含蓄点,别见人理解有误就“潇洒”的给人“小丑”,“二”之类的评价,我觉得可能会更好。你说呢?