【问题标题】:What are the valid alignment values for std::align_val_t for C++ allocators?对于 C++ 分配器,std::align_val_t 的有效对齐值是什么?
【发布时间】:2018-03-06 00:10:34
【问题描述】:

既然 C++ 有几个带有 std::align_val_t 参数的附加 new 和 delete 运算符,它们的有效值是什么?

它们是 1、2、4、8、...等等吗?

数值有上限吗?

由编译器定义?

【问题讨论】:

  • 我希望这些值与 alingas 的值相同
  • @StoryTeller 是否有 C++ 标准的一部分说它们必须与 alignas 相同?是什么让您期望它们相同?
  • 嗯,类似的目的。
  • 是的,该标准详细指定了有效对齐方式。看我的回答。

标签: c++ memory memory-management dynamic-memory-allocation allocation


【解决方案1】:

std::align_val_t 及其约束在语言支持标头<new> 的概要中指定。因此,如果有人阅读[new.delete],它会显示以下内容:

除另有规定外, [basic.stc.dynamic] 适用于 operator new 和 operator new 的库版本 运算符删除。 如果将对齐参数的值传递给任何 这些函数中的一个不是有效的对齐值,行为是 未定义。

所以你必须传递一个有效的值,其中有效对齐的定义在[basic.align]/4

对齐表示为 std​::​size_t 类型的值。有效的 对齐仅包括由 alignof 表达式返回的值 对于基本类型加上额外的实现定义 一组值,可能为空。每个对齐值应为 二的非负整数幂。

所以是的,只有 2 的幂加上您的实现明确允许的任何值。不要担心上面提到的std::size_tstd::align_val_t 只是一个以std::size_t 为基础类型的枚举类:

enum class align_val_t : size_t {};

这也意味着您询问的上限,本质上是std::numeric_limits<std::size_t>::max()。但当然,您的实施可能会强制执行较低的实施。

【讨论】:

  • 谢谢。就目前而言,这很好。你能回答我问题的另一部分吗?支持的对齐方式的上限值是多少?
  • @LincolnMan - 唯一的绑定似乎是std::numeric_limits<std::size_t>::max()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 2018-07-08
相关资源
最近更新 更多