【问题标题】:Does new char actually guarantee aligned memory for a class type?new char 实际上是否保证了类类型的对齐内存?
【发布时间】:2012-05-22 04:56:31
【问题描述】:

通过new char[sizeof(T)] 分配缓冲区,保证分配的内存与T 类型正确对齐,其中T 的所有成员都有其自然的、实现定义的对齐(也就是说,您没有使用alignas 关键字来修改它们的对齐方式)。

我在这里的一些答案中看到了这个保证,但我并不完全清楚标准是如何达到这个保证的。标准的5.3.4-10给出了基本要求:本质上new char[]必须与max_align_t对齐。

我缺少的是alignof(T) 将始终是最大值为max_align_t 的有效对齐方式。我的意思是,这似乎很明显,但结构的对齐结果是否必须最多为max_align_t?甚至第 3.11-3 点说可能支持扩展对齐,所以编译器可以自己决定一个类是过度对齐的类型吗?

【问题讨论】:

  • 最后,一个好问题。我可以投票很多次吗? (点击点击点击)
  • @JohnDibling:你自己,不,但幸运的是我们有很多人:D
  • 不是答案,但您不能安全地使用new T 并投射结果吗?哦,+1 教我一个新标签。我从未听说过语言律师。
  • 规范中关于sizeof 的内容也必须是相关的:5.3.3-2 说“当应用于一个类时,结果是该类对象中的字节数,包括任何填充将该类型的对象放入数组中所需的"
  • 我还是不明白这个问题。

标签: c++ c++11 language-lawyer


【解决方案1】:

表达式new char[N]new unsigned char[N] 是有保证的 为任何对象返回足够对齐的内存。见§5.3.4/10 "[...] 对于 char 和 unsigned char 数组,它们之间的区别 new-expression 的结果和分配返回的地址 函数应是最严格基本函数的整数倍 大小不大于任何对象类型的对齐要求 (3.11) 比正在创建的数组的大小。 [注:因为分配 假设函数返回指向存储的指针 适当地对齐任何类型的对象与基本 对齐,这种对数组分配开销的约束允许 将字符数组分配到其他对象的常见习语 稍后将放置类型。 ——尾注]"。

当然,从风格的角度来看:如果您想要分配原始 记忆,这样说更清楚:operator new(N)。从概念上讲, new char[N] 创建 N char; operator new(N) 分配 N 字节。

【讨论】:

  • 只需要为具有基本对齐要求的类型提供对齐,最高可达max_align_t。所以问题是编译器是否可以创建扩展对齐的类类型,因此不会从根本上对齐。
  • 这个答案增加了什么?标准引用与问题中引用的部分相同。
【解决方案2】:

我缺少的是alignof(T) 将始终是最大值为max_align_t 的有效对齐方式。我的意思是,这似乎很明显,但是结构的对齐结果最多只能是 max_align_t 吗?甚至第 3.11-3 点说可能支持扩展对齐,所以编译器可以自己决定一个类是过度对齐的类型吗?

正如 Mankarse 所说,我能得到的最佳报价来自 [basic.align]/3

具有扩展对齐要求的类型是过度对齐的类型。 [ 笔记: 每个过度对齐的类型都是或包含扩展对齐适用的类类型(可能通过非静态数据成员)。 ——尾注]

这似乎暗示必须明确要求扩展对齐(然后传播)但不能

我希望能更清楚地提及;对于编译器编写者来说,意图是显而易见的,任何其他行为都是疯狂的,仍然......

【讨论】:

  • 它使用了applied这个词,编译器可以自己应用扩展对齐吗?或者在段落中的第 1/2 点暗示编译器应用的任何对齐方式最多只能是 max_align_t?
  • @edA-qamort-ora-y: [dcl.align]/1 也使用动词 apply:“可以应用对齐说明符”,所以我期望这意味着它是应用程序的来源,应该明确要求,但是...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2018-05-22
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多