我有一个地址,说十六进制0x26FFFF,如何检查给定地址是否为64位对齐?我知道该地址应为8的倍数以便64位对齐,那么如何使其变为64位对齐?有哪些不同的方法可以做到这一点呢?
答案 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函数。给定一个缓冲区地址,它返回缓冲区中遵守特定对齐约束的第一个地址,如果需要变量重新分配,则可用于在缓冲区中找到合适的位置。