C++ 11引入了 alignas
specifier来指定变量的对齐方式,并引入 alignof
operator来查询类型的默认对齐方式。但是,我看不到任何方法来获取特定变量的对齐方式。让我们举一个简单的例子:
alignas(16) float* array;
这是我们可以做的:
alignof(float*)
返回8,这显然不是我们想要的。 alignof(array)
返回16,这正是我们想要的,但这是编译器扩展;标准指定的alignof
不能用于特定变量。 alignof(decltype(array))
返回8,这是我们期望的,但不是我们想要的。 std::alignment_of
是根据alignof
实现的,因此并没有太大帮助。 我想要一种机制来确认特定变量
array
在16字节边界上对齐。标准中是否有任何内容可以执行这样的查询? 最佳答案
您可以尝试以下方法:
bool is_aligned(const volatile void *p, std::size_t n)
{
return reinterpret_cast<std::uintptr_t>(p) % n == 0;
}
assert(is_aligned(array, 16));
上面假设了一个平坦的地址空间,并且对
uintptr_t
的算术等效于对char *
的算术。尽管这些条件在大多数现代平台上都普遍存在,但标准都不要求这两个条件。
只要将
void *
转换回uintptr_t
时可以反转转换,则实现完全有可能在将uintptr_t
转换为void *
时执行任何转换(请参见What is uintptr_t data type)。N4201中的更多详细信息(除其他事项外,它建议
is_aligned()
操作)。编辑
它允许类似:
alignas(16) volatile float a;
assert(is_aligned(&a, 16));
没有
volatile
,您会得到错误其他引用: