对内存对齐的理解

先介绍一篇有用的文章,来自外网,这里简单翻译一下,

什么是数据对齐?

在编程语言中,一个数据对象(变量)有两个属性;它的值和存储位置(地址)。数据对齐是指数据的地址可以被1、2、4或8整除。换句话说,数据对象可以有1字节、2字节、4字节、8字节对齐或任何幂2. 比如一个数据的地址是12FEECh(十进制1244908),那么就是4字节对齐,因为地址可以被4整除。(你可以除以2或1,但是4是可整除的最高数。)

CPU 不会一次读取或写入一个字节。相反,CPU 一次以 2、4、8、16 或 32 字节块访问内存这样做的原因是性能 ------ 访问 4 字节或 16 字节边界上的地址比访问 1 字节边界上的地址快得多。

对内存对齐的理解

 

也就是说在某个地址上写入数据时,如果该地址不是对齐的地址,那CPU就要操作两次才能拿到完整的数据,所以数据慢了。

如何判断当前地址是否为所要获取字节的对齐地址呢? 

比如,使用 AVX 算法时,CPU 可以一次性从当前地址上读取 32 字节的数据,为了保证高效性,内存对齐是必要的,那么我们就可以依靠


#define PTR_ADDR(p) ((unsigned long)p)
if (PTR_ADDR(address) % 32 == 0) {
    // 内存是对齐的
  }

在二进制上至少需要 0010 0000 的倍数才行, 0010 0000 换成十进制是 32,等于 0110 0000,1110 0000 这样的都是可以的,换成 16进制就是 0x20 的倍数

例子:How Do I check a Memory address is 32 bit aligned in C

手动创建对齐数组,

float __declspec(align(32)) out[8] = {}; // 在 windows 上创建 32 个字节对齐的地址

 

原文链接: https://www.cnblogs.com/strive-sun/p/15134971.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    对内存对齐的理解

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404607

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:38
下一篇 2023年4月25日 下午4:38

相关推荐