【问题标题】:C++ alignment and arraysC++ 对齐和数组
【发布时间】:2017-05-17 11:27:16
【问题描述】:
  • 我有一些类型 T,我明确指定为 x-aligned
  • x > sizeof(T)
  • x > 任何实现基本对齐
  • (例如:x 与页面或缓存对齐)

假设我现在有:T arr[y],其中arrx 对齐(通过在堆栈上或数据中分配,或通过 x-对齐的堆分配)

那么至少有一些arr[1],...,arr[y-1] 不是x-对齐的。

对吗? (事实上​​,如果sizeof(T) 不随扩展对齐规范而改变,它必须是正确的)

注意1:这不是How is an array aligned in C++ compared to a type contained? 相同的问题。这个问题询问的是数组本身的对齐方式,而不是内部单个元素的对齐方式。

注意 2:这个问题:Does alignas affect the value of sizeof? 本质上是我要问的 - 但对于扩展对齐。

注意 3:https://stackoverflow.com/a/4638295/7226419 是对该问题的权威答案(sizeof(T) 包括满足对齐要求所需的任何填充,以使 T 的数组中的所有 T 正确对齐。

【问题讨论】:

  • 也可能是 stackoverflow.com/questions/13284208/… 的副本?
  • @AurelBílý 见注释
  • 可用这种东西标准没有由标准定义,让编译器适合给定平台。还有编译器设置可以改变这种行为,所以代码不应该假设事情是如何对齐的。
  • 数组元素总是 sizeof T 分开。 Sizeof T 可能大于 T 的各分量之和。
  • 不清楚你在追求什么。你的实际问题是什么?

标签: c++ c


【解决方案1】:

如果T 类型是x 对齐的,则T 类型的每个对象都是x 对齐的,包括任何数组元素。特别是,这意味着x > sizeof(T) 不可能成立。

对几个现代编译器的快速测试证实:

#include <iostream>

struct alignas(16) overaligned {};
struct unaligned {};

template <class T> void sizes()
{
    T m, marr[2];
    std::cout << sizeof(m) << " " << sizeof(marr) << std::endl;
}

int main ()
{
    sizes<unaligned>();
    sizes<overaligned>();
}

输出:

1 2
16 32

【讨论】:

  • 感谢您的回复。 “如果类型 T 是 x 对齐的,则类型 T 的每个对象都是 x 对齐的,包括任何数组元素”这句话是我想要的文档,因为这意味着,正如我在问题中所说,扩展对齐可以改变结构的大小
  • 我应该重新表述整个问题,真的。它的形状很糟糕。
  • “是我想要的文档”。我很难想象类型对齐会意味着什么。 “扩展对齐可以改变结构的大小” 相比什么变化?没有相同但未对齐的类型。
  • 对于您的第一个问题,我正在寻找标准的来源,例如 (stackoverflow.com/a/4638295/7226419)
  • 对于您的第二个问题,您的答案显示了具有完全相同成员的结构如何根据添加alignas(16) 来改变大小。同样,措辞不好,但 change 是从 struct T {...}struct alignas(x) T {...}
猜你喜欢
  • 2017-11-15
  • 2012-07-23
  • 2010-12-13
  • 2019-03-30
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多