Memory 如何知道地址是否64位对齐?

Memory 如何知道地址是否64位对齐?,memory,Memory,我有一个地址说hex 0x26FFFF如何检查给定的地址是否64位对齐?我知道地址应该是8的倍数,以便64位对齐,那么如何使其64位对齐,有哪些不同的方法可以做到这一点 要检查地址是否64位对齐,只需检查其3个最低有效位是否为空。比如说 (ad & 0x7) == 0 检查ad是否为8的倍数 地址是在编译时分配的,许多编程语言都有指定对齐方式的方法。例如,由于cc+++ 11或c11,您可以在C++中或c中使用对齐()/(通过包括Stalang.h)来指定变量的对齐方式。因此 alig

我有一个地址说hex 0x26FFFF如何检查给定的地址是否64位对齐?我知道地址应该是8的倍数,以便64位对齐,那么如何使其64位对齐,有哪些不同的方法可以做到这一点

要检查地址是否64位对齐,只需检查其3个最低有效位是否为空。比如说

(ad & 0x7) == 0
检查ad是否为8的倍数

地址是在编译时分配的,许多编程语言都有指定对齐方式的方法。例如,由于cc+++ 11或c11,您可以在C++中或c中使用<代码>对齐()/<代码>(通过包括Stalang.h)来指定变量的对齐方式。因此

alignas(8) char str[24];
保证str是64位对齐的

在alignas关键字出现之前,人们使用一些技巧来精细地控制对齐。例如,结构被对齐为其最大字段。但是,举例来说,没有办法确保一个具有8个字符的结构或具有一个字符和一个int的结构是8字节对齐的。根据情况,人们可以使用填充、联合等。这不再是必需的,而
alignas()
是控制变量对齐的首选方法

使用
malloc()
动态分配的数据应该“针对任何内置类型适当对齐”,因此总是至少64位对齐

这可用于将未对齐的数据移动到对齐的地址。例如,如果在未对齐的地址处有一个字符串str,并且希望将其对齐,则只需
malloc()
适当的大小,并将
memcpy()
数据放在新位置即可


注意:ST::C++中的AlgEngin函数。给定一个缓冲区地址,它返回缓冲区中符合特定对齐约束的第一个地址,如果需要变量重新分配,它可以用于在缓冲区中找到适当的位置

要检查地址的对齐方式,请遵循以下简单规则; 因为,字节是处理内存访问的最小单位 64位地址有8个字节。 (考虑1字节=8比特)

所以,, Log2(n)=Log2(8)=3(了解功率) 其中,n是字节数

这意味着低三位为零,以遵循对齐规则。 例如。 如果我有地址,比如0xC000\u 0004 下一个对齐地址是:0xC000\U 0008。 您可以验证以下地址的低三位是否为零,即 0xC000_0005 0xC000_0006 0xC000_0007 因此,在C000_0004之后,下一个64位对齐的地址是C000_0008

谢谢