《深入理解计算机系统》中写到
32位 :linux下 2字节类型的数据的地址必须是2的倍数,4,8字节类型的数据的地址必须是4的倍数;,windows上 n个字节类型的数据的地址必须是n的倍数
x64-64位:linux和windows 都是 n个字节类型的数据的地址必须是n的倍数,如 long int ,double,指针都是8字节对齐,long double 16字节对齐k字节对齐,则结构体总大小要是k的倍数,不够的末尾补齐
#include
#include
#include
/* 32位
linux 2字节类型的数据的地址必须是2的倍数
4,8字节类型的数据的地址必须是4的倍数,
windows n个字节类型的数据的地址必须是n的倍数
64位 无论linux windows都是 n个字节类型的数据的地址必须是n的倍数
k字节对齐,则结构体总大小要是k的倍数,不够的末尾补齐
*/
struct MyStruct3
{
char d; //0
short b; //2
char n; //4
int g; //8 ---mystruct3总大小为12
};
struct MyStruct4
{
char d; //0
short b; //2
char n; //4
char m; //5
int g; //8
double f; //16 ---mystruct4总大小为24
};
struct MyStruct5
{
char d; //0
short b; //2
char n; //4
int g; //8
double f; //16 ---8字节对齐,偏移地址要是8的倍数
int m; //24 ---mystruct5总大小为32,【末尾补了4个字节,以使得8字节对齐】
};
int main(int argc, char *argv[])
{
int *b[2][3];
printf("sizeof(MyStruct3)=%d,sizeof(MyStruct4)=%d,sizeof(MyStruct5)=%d,sizeof(b)=%d,sizeof(double)=%d,sizeof(int)=%d\n", sizeof(MyStruct3), sizeof(MyStruct4), sizeof(MyStruct5), sizeof(b), sizeof(double),sizeof(int));
return 0;
}
//sizeof(MyStruct3)=12,sizeof(MyStruct4)=24,sizeof(MyStruct5)=32,sizeof(b)=48,sizeof(double)=8,sizeof(int)=4