1, 实验原料 源代码
hello.c
#include <stdio.h>#define ALI // __attribute__((aligned(64)))float ALI adddd(float a, float b, float c, float d){a+=b;a+=c;a+=d;return a;
}float ALI subbbb(float a, float b, float c, float d)
{a-= b;a-=c;a-=d;return a;
}int main ()
{float x,y,z,s;x = 77.777;y = 1.111;z = 2.222;s = 3.333;printf("sum = %7.3f\n", adddd(x,y,z,s));printf("sub = %7.3f\n", subbbb(x,y,z,s));return 0;
}
2, no align 要求
#define ALI // __attribute__((aligned(64)))
ALI 定义为空,相当于不存在;
gcc hello.c
./a.out
objdump -d ./a.out
运气比较好,adddd函数的指令首地址为 0000001149
3,16字节 align
下面分别变成
#define ALI __attribute__((aligned(16)))
和
#define ALI __attribute__((aligned(64)))
来试试效果:
#define ALI __attribute__((aligned(16)))
效果同预期,adddd 的首指令地址变成了 00000001150,是可以整除16的
#define ALI __attribute__((aligned(64)))
4, 使用 -falign-functions=N
gcc -falign-functions=1 hello_align.c -o a.16.out
gcc -falign-functions=2 hello_align.c -o a.16.out
gcc -falign-functions=4 hello_align.c -o a.16.out
16:
可以看出来,函数体指令首地址都满足对齐要求。