
给你一个例子:VS2005编译。
修改ALIGN_BYTES宏就可以了。
#include<stdioh>
#define ALIGN_BYTES 64
typedef struct {
int x;
char align[ALIGN_BYTES - sizeof(int)];
} AlignType;
int main()
{
AlignType a[4];
printf("%p\n", &a[0]);
printf("%p\n", &a[1]);
printf("%p\n", &a[2]);
printf("%p\n", &a[3]);
return 0;
}
这样做的目的是牺牲空间来提高执行速度
当被处理的数据的起始地址是cpu字长的整数倍的时候 *** 作起来访问内存的次数最少
举个例子,一个int变量如果没按4字节对其,CPU需要访存2次才能从内存中将其读取,而对齐了的话一次就够
简单说,任何CPU都有一个固定的基本长度,下面以32位CPU为例(也有64位或其他的)。CPU在工作时只能按照该长度的整倍数为边界进行内存 *** 作。即只能从地址0、32、64、96处进行存取,而不能从27、58、83等非边界地址处进行。如果一定要取这些非边界地址处的内容,则必须用若干个 *** 作将其凑出来,因而大大影响存取效率。
另一方面,一个结构体的设计长度却并不一定是32的倍数,例如一个包含六个字符的结构其设计长度仅为48位。如果多个这样的结构在内存中顺着摆放,则许多结构的起始地址将不在边界处。因此,编译程序总是会将每个结构的尾部都加入一些必要的空白,将其凑成32的整数倍。这就是边界对齐的基本道理。
以上就是关于关于C语言中边界对齐的问题全部的内容,包括:关于C语言中边界对齐的问题、C语言 结构体 内存对齐、C语言结构体的边界对齐是怎么回事啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)