【发布时间】:2018-12-08 11:46:06
【问题描述】:
我很难解释来自https://en.cppreference.com/w/cpp/memory/align 的std::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,如果您请求的对齐方式与 short, int, long, double, ... 等 C++ 内置类型之一的对齐方式不匹配,则使用 std::align 是未定义的行为。因此,使用具有大于 std::max_align_t(通常为 8 或 16)的对齐值的 std::align 会导致未定义的行为。
但现在 C++17 发生了变化:
... 2 的幂(C++17 起)。
我猜这意味着从 C++17 开始,任何 2 的幂都是std::align 的有效对齐方式。
谁能证实这一点?
更新:
对于 GCC 和 LLVM 的 std::align 实现,任何 2 的幂都是有效的对齐方式。对于任何非 2 的幂对齐值,GCC 和 LLVM 的 std::align 实现会导致未定义的行为。
- GCC 的
std::alignimplementation - LLVM 的
std::alignimplementation
这似乎证实了我的假设:
从 C++17 开始,任何 2 的幂都是 std::align 的有效对齐方式。
而且我已经测试过,即使对于 C++11,std::align 也可以使用 GCC、LLVM 和 MSVC 对任何 2 的幂对齐值正常工作。
【问题讨论】:
-
已经在这里问过stackoverflow.com/questions/44232984/…,但是除了几个cmets之外没有答案...
-
好的,谢谢。我将尝试找到 LLVM 和 GCC 的 std::align 实现,看看它们如何解释标准......
-
对于 GCC,任何对齐值都可以:github.com/gcc-mirror/gcc/blob/…
-
LLVM 的实现适用于任何 2 值的幂,并导致任何非 2 值的未定义行为:github.com/llvm-mirror/libcxx/blob/…
-
实际上 GCC 的实现也会导致任何非 2 次幂值的未定义行为。