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:

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