概述
要想高速利用内存就必须高效利用cpu cache,关于cpu cache这里就不多加讨论了,自己感兴趣可以google
而cpu访问内存的单位是cache line,因此高效利用cache line是写c程序的必要条件
__attribute__ 作用于结构体内部变量
3 struct foo{ 4 int a; 5 6 char b;// __attribute__((aligned(64))); 7 8 // char c; 9 };//__attribute__((aligned(64))); 10 int main() 11 { 12 struct foo foo; 13 printf("%d ",(sizeof(struct foo))); 14 return 0; 15 }
输出为8,因为编译器会默认对结构体中的每个元素做对齐,而对其单位为结构体中占字节最多的变量
3 struct foo{ 4 int a; 5 6 char b __attribute__((aligned(64))); 7 8 // char c; 9 };//__attribute__((aligned(64))); 10 int main() 11 { 12 struct foo foo; 13 printf("%d ",(sizeof(struct foo))); 14 return 0; 15 }
输出为128,因为__attribute__作用于结构体内部变量时会把该变量与结构体首地址的偏移设置为64的倍数,
即b-a的地址偏移为64,而编译器会默认对结构体中的每个元素做对齐,而本例中在编译器看来
变量a占的内存空间为64字节,因此输出为128
3 struct foo{ 4 int a; 5 6 char b __attribute__((aligned(64))); 7 8 char c; 9 };//__attribute__((aligned(64))); 10 int main() 11 { 12 struct foo foo; 13 printf("%d ",(sizeof(struct foo))); 14 return 0; 15 }
输出仍为128,因为b只占用了1个字节,而结构体是按64字节对齐的,因此c-b地址偏移为1
__attribute__ 作用于结构体
3 struct foo{ 4 int a; 5 6 char b ;//__attribute__((aligned(64))); 7 8 char c; 9 }__attribute__((aligned(64))); 10 int main() 11 { 12 struct foo foo; 13 printf("%d ",(sizeof(struct foo))); 14 printf("%p ",(&foo)); 15 return 0; 16 }
输出
64
0x7fffd34de600
当__attribute__作用于结构体时有两个作用,一个是让结构体的大小是64的倍数,另外一个作用
是当在栈上分配结构时,结构体的首地址是64的倍数;如果在堆上分配结构体的话,则结构体的
首地址不一定是64的倍数。