【问题标题】:Can I use std::align to align memory to arbitrary values of 2?我可以使用 std::align 将内存对齐到任意值 2 吗?
【发布时间】:2018-12-08 11:46:06
【问题描述】:

我很难解释来自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,如果您请求的对齐方式与 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 实现会导致未定义的行为。

这似乎证实了我的假设:

从 C++17 开始,任何 2 的幂都是 std::align 的有效对齐方式。

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

【问题讨论】:

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


【解决方案1】:

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

这不是 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) 的任何对齐。

【讨论】:

  • C++17 怎么样,你能确认或否认任何 2 值的幂都是有效对齐吗?
  • @Linoliumz:这是纯英文文本;它的意思是它所说的。我不知道你为什么需要验证。
  • 对我来说这很令人困惑,因为我不知道“二的幂(自 C++17 起)”是一个独立的句子,还是必须以某种方式与句子的第一部分组合.
  • @Linoliumz:Cppreference 有点像差异。特定于版本的内容必须根据您要应用到的版本来读取/忽略。如果一段加框文本显示“自 C++17 以来”,并且您想知道某些内容在 C++17 中是如何工作的,那么该文本适用于 C++17 及更高版本。如果一段加框文本显示“C++17 之前”,那么该文本适用于 C++17 之前的所有版本。如果您正在阅读 C++17 所说的内容,那么您忽略该框。无版本文本适用于所有版本(适用。std::align 是 C++11 函数,因此未装箱文本隐式需要 C++11)。
  • 感谢您的解释 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2018-02-24
  • 2011-02-09
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多