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:

可以看出来,函数体指令首地址都满足对齐要求。