【问题标题】:Padding of array-like structs类数组结构的填充
【发布时间】:2017-05-12 00:20:21
【问题描述】:

给定一个包含相同基本类型序列的结构,如下所示:

struct Vector
{
    float x;
    float y;
    float z;
};

它可以在成员之间有填充吗?我收到了指向 [class.mem] 的链接,上面说可以添加填充以实现对齐,但它适用于这种情况吗?

【问题讨论】:

  • 如果引入padding会给你带来问题,你可以尝试使用static_assert在编译时检查。例如,static_assert(sizeof(Vector) == sizeof(float) * 3, "");
  • 我很确定除了第一个成员之前没有填充并且每个单独的类型都正确对齐之外,您不能假设任何事情。成员之间或之后的 AFAIK 填充符合要求(尽管看似毫无意义)。
  • @FrançoisAndrieux 我不确定它是否真的回答了Vector成员之间是否有填充
  • @W.F.不,它不能。如果sizeof(Vector) 是三个浮点数,并且我们知道Vector 至少包含三个浮点数,那么就不会在任何地方留下一个字节用于填充。
  • @Donnie 这还不错,因为用户可以使用编译器扩展来操作它。

标签: c++ struct language-lawyer padding


【解决方案1】:

似乎没有技术原因导致结构中的浮点数与数组中的对齐方式不同。但是仍然存在C++ 在二进制级别上缺乏标准化

如果你想安全,那么你可以添加一个static_assert

static_assert(offsetof(Vector, y) - offsetof(Vector, x) == sizeof(float));
static_assert(offsetof(Vector, z) - offsetof(Vector, y) == sizeof(float));

此外,您还可以通过非跨平台方式禁用填充。对于 Visual Studio,您需要 #pragma pack,对于 gcc,您需要使用属性 packed

【讨论】:

  • 您能提供标准的报价吗?这是一个语言律师问题。
  • @Lyberta 往往不会引用关于缺乏要求的报价
  • 肯定没有办法确保不发生填充吗?这感觉很重要,足以保证一个明确的答案。
  • @PasserBy 还有明确的答案。填充是实现定义的。这就是它的结束。而且,虽然我不确定这个答案中的第二句话是否同意我的观点,但 这是一件好事。您想要某种方法来控制是否发生填充?阅读实施文档。
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2019-07-20
相关资源
最近更新 更多