__attribute __ 其实是个编译器指令,告诉编译器声明的特性,或者让编译器进行更多的错误检查和高级优化。
attribute 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
__attribute __ 是GCC的特性,LLVM借鉴过来,又对其进行了扩展。
语法格式为:__attribute __ ((attribute-list))
常用属性
1、aligned
指定对象的对齐格式(以字节为单位)
什么是字节对齐
现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐.
字节对齐的好处
为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位)。字节对齐有什么好处?以int型数据为例,如果它在内存中存放的位置按4字节对齐,也就是说1个int的数据全部落在计算机一次取数的区间内,那么只需要取一次就可以了.
对齐原则:
char 偏移量必须为sizeof(char) 即1的倍数,可以任意地址开始存储
short 偏移量必须为sizeof(short) 即2的倍数,只能从0,2,4…等2的倍数的地址开始存储
int 偏移量必须为sizeof(int) 即4的倍数,只能从0,4,8…等4的倍数的地址开始存储
float 偏移量必须为sizeof(float) 即4的倍数,只能从0,4,8…等4的倍数的地址开始存储
double 偏移量必须为sizeof(double)即8的倍数,只能从0,8,16…等地址开始存储
结构体如何设定字节对齐
当未明确指定时,以结构体中最长的成员的长度为其有效值,上面的两个结构体都是int类型最长,也就是4字节对齐
结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍.不足的要补齐.
函数的对齐方式写法
eg
struct stu{
char sex;
int length; ;
char name[2];
char value[15];
}__attribute__ ((aligned (4)));
struct stu my_stu;
当 我们传入1 和2 的时候,编译器模式都是以4字节对齐的
函数的对齐方式写法
ref
https://www.jianshu.com/p/e2dfccc32c80
https://blog.csdn.net/weaiken/article/details/88085360