Key Words
None
__attribute__ / packed
取消对齐的方法
上面两种定义 stu 的方式都可以屏蔽编译器的自动对齐,输出结果为:
不对自动对齐限制的情况下输出结果为:
可以看出编译器遵循的对齐方法: 1. 首先默认4字节对齐,所以char sex
占e2809960-e2809963
2. 对int占4字节e2809964-e2809967
3. 对char型数组占10字节e2809968-e2809971
最后对整个结构体进行4字节的对齐,故占据4+4+12=20字节
探究默认对齐方式
输出结果:
什么时候需要设置对齐?
在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.
字节对齐有什么作用?
字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。
对于32位机来说,4字节对齐能够使cpu访问速度提高,比如说一个long类型的变量,如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了。但是在32位机中使用1字节或者2字节对齐,反而会使变量访问速度降低。所以这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。
static
当变量声明为static时,空间将在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也只分配一次,前一次调用中的变量值通过下一次函数调用传递。这对于在C/C ++或需要存储先前函数状态的任何其他应用程序非常有用。 在cpp文件中,全局变量不加static会在汇编的符号表中加上.global
,全局可访问;加上static
可以使得该变量只能在本文件中访问,减小访问的范围,在符号表中类似于.local
,如:
其中,变量gg是全局变量不带static,变量lqq是static的全局变量。
Reference
Last updated