64位与32位linux c开发时默认字节对齐方式分别为8和4。
在默认情况下,32位操作系统字节对齐方式是4个字节,但64位操作系统,字节对齐是8个字节。
看下面的例子
#include <stdio.h>
typedef union {
int data[5];
}DATA;
int main(int argc,char **argv){
DATA data;
printf("%d \n",sizeof(data));
return 0;
}
上面的运行结果是 【 20 】(64位机器)
再看下面的例子
#include <stdio.h>
typedef union {
int data[5];
long id;
}DATA;
int main(int argc,char **argv){
DATA data;
printf("%d \n",sizeof(data));
return 0;
}
上面的运行结果是 【 24 】,按照一般情况,我们是说union的字节数大小是等于最大的那个,就是20。。。。。
再看一个例子
#include <stdio.h>
typedef union {
int data[4];
long id;
}DATA;
int main(int argc,char **argv){
DATA data;
printf("%d\n",sizeof(data));
return 0;
}
上面的运行结果是 【 16 】
其实上面的结果就是对齐之后的结果,特别是24的,它是从第三个8个字节位置开始对齐。所以它的大小是 int data[4] + long。
因此,在计算结构体的sizeof时,不但要考虑对齐的字节数,还要考虑开始对齐的位置,其实也就是对齐方向(大端小端的问题了)