对于C ++分配器,std :: align_val_t的有效对齐值是什么?

时间:2017-09-25 05:29:50

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

现在C ++有几个额外的带有std :: align_val_t参数的new和delete运算符,它们的有效值是什么?

他们是1,2,4,8 ......等等吗?

值是否有上限?

由编译器定义?

1 个答案:

答案 0 :(得分:3)

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

  

除另有规定外,其他规定   [basic.stc.dynamic]适用于operator new和的库版本   运营商删除。 如果对齐参数的值传递给any   这些函数不是有效的对齐值,行为是   未定义。

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

  

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

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

enum class align_val_t : size_t {};

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