注意:
并不是32位就直接按照4个字节对齐,64位就按照8个字节对齐。
CPU 一次能读取多少内存要看数据总线是多少位
CPU 不能跨内存区间访问
。例子:
假设有这样一个结构体如下:
struct st3
{
char a;
int b;
};
//在32位系统下,它就应该是8个字节的。
假设地址空间是类似下面这样的:
在没有字节对齐的情况下,
如果进行字节对齐的话
总结:
字节对齐的根本原因其实在于 cpu 读取内存的效率问题
,对齐以后,cpu读取内存的效率会更快。两种。
//用法如下
#pragma pack(n)//表示它后面的代码都按照n个字节对齐
struct st3
{
char a;
int b;
};
#pragma pack()//取消按照n个字节对齐,是对#pragma pack(n)的一个反向操作
#include
#pragma pack(1)//表示它后面的代码都按照n个字节对齐
struct st3
{
char a;
int b;
};
#pragma pack()//取消按照n个字节对齐,是对#pragma pack(n)的一个反向操作
#pragma pack(2)//表示它后面的代码都按照n个字节对齐
struct st4
{
char a;
int b;
};
#pragma pack()//取消按照n个字节对齐,是对#pragma pack(n)的一个反向操作
int main()
{
printf("%d\n",sizeof(struct st3) );
printf("%d\n",sizeof(struct st4) );
return 0;
}
__attribute__ ((packed))
的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐
,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关.
//用法如下
struct bbb
{
char a;
int b;
}__attribute__((packed));//直接按照实际占用字节来对齐,其实就是相当于按照1个字节对齐了
//这里计算sizeof(st3)=5
#include
struct st3
{
char a;
int b;
}__attribute__((packed));
struct __attribute__((packed)) st4
{
int b;
char a;
};
int main()
{
printf("%d\n",sizeof(struct st3) );
printf("%d\n",sizeof(struct st4) );
return 0;
}