我可以使用std :: align将内存对齐为任意值2吗?

时间:2018-12-08 11:46:07

标签: c++ c++11 c++17

我很难解释https://en.cppreference.com/w/cpp/memory/alignstd::align的以下描述

void* std::align(std::size_t alignment,
                 std::size_t size,
                 void*& ptr,
                 std::size_t& space );
  

如果对齐不是实现(直到C ++ 17)的2的幂(自C ++ 17起)所支持的基本对齐或扩展对齐值,则该行为不确定。

如果我的理解是正确的,那么这意味着对于C ++ 11,使用std::align的行为是不确定的,如果您请求的对齐方式与short, int, long, double, ...等C ++内置类型之一的对齐方式不匹配。因此,使用比对值大于std::align(通常为8或16)的std::max_align_t会导致不确定的行为。

但是对于C ++ 17,现在有了变化:

  

... 2的幂(从C ++ 17开始)。

我想这意味着自C ++ 17以来,{2}的任何幂都是std::align的有效对齐方式。

有人可以确认吗?

更新:

对于GCC和LLVM的std::align实现,2的幂均是有效的对齐方式。对于任何非2对齐值的幂,GCC和LLVM的std::align实现都会导致未定义的行为。

这似乎证实了我的假设:

  

自C ++ 17起,任何2的幂均是std :: align的有效对齐方式。

而且我已经测试过,即使对于C ++ 11 std::align,也可以使用GCC,LLVM和MSVC在2对齐值的任意幂上正常工作。

1 个答案:

答案 0 :(得分:2)

  

对于使用std :: align的C ++ 11,如果您请求的对齐方式与诸如short,int,long,double,...等C ++内置类型之一的对齐方式不匹配,则为未定义行为。

那不是cppreference或the standard所说的。从C ++ 14 [ptr.align] /2.1:

  

alignment 是此环境中实现支持的基本对齐值或扩展的对齐值

基本对齐方式不是基本类型的对齐方式。来自[basic.align]/2

  

基本对齐方式表示为小于或等于该实现在所有上下文中支持的最大对齐方式的对齐方式,该对齐方式等于alignof(std::max_align_t)(18.2)。

就是这样。再加上[basic.align] / 4的声明,即所有对齐方式必须为2的幂,这意味着基本对齐方式是小于或等于alignof(std::max_align_t)的任何对齐方式。