关于C语言中边界对齐的问题

关于C语言中边界对齐的问题,第1张

给你一个例子: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语言结构体的边界对齐是怎么回事啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10110340.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存