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

时间:2019-06-25 11:33:51

标签: memory

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

2 个答案:

答案 0 :(得分:1)

为了检查地址的对齐方式,请遵循以下简单规则; 因为字节是与内存访问一起使用的最小单位 64位地址有8个字节。 (考虑到1个字节= 8位)

因此, Log2(n)= Log2(8)= 3(知道功率) 其中,n是字节数。

这意味着低三位为零,以便遵循对齐规则。 例如。 如果我有地址,例如0xC000_0004 下一个对齐的地址为:0xC000_0008。 您可以验证以下地址的低三位不为零,它们是 0xC000_0005 0xC000_0006 0xC000_0007 因此,在C000_0004之后,下一个64位对齐的地址为C000_0008。

谢谢

答案 1 :(得分:0)

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

(ad & 0x7) == 0

检查广告是否为8的倍数。

地址是在编译时分配的,许多编程语言都有指定对齐方式。例如,从CC ++ 11或C11开始,您可以在C ++或C中使用alignas()(通过包含stdalign.h)来指定变量的对齐方式。因此

alignas(8) char str[24];

保证str是64位对齐的。

在alignas关键字之前,人们使用技巧来精确控制对齐方式。例如,将一个结构对齐为其最大字段。但是,例如,无法确保具有8个字符的结构或具有char和int的结构的8个字节对齐。根据情况,人们可以使用padding,union等。这不再是必需的,alignas()是控制变量对齐的首选方法。

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

这可用于将未对齐的数据移动到对齐的地址。例如,如果您在未对齐地址处有一个字符串str并想要对其进行对齐,则只需malloc()适当的大小并在新位置memcpy()插入数据。

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