数组结构体的填充

5

给定一个包含相同基本类型序列的结构体,类似于:

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

成员之间可以有填充吗?我被给予了链接[class.mem],它说可以添加填充以实现对齐,但这是否适用于此情况?


1
如果对于引入填充会造成问题,你可以尝试使用 static_assert 在编译时进行检查。例如,static_assert(sizeof(Vector) == sizeof(float) * 3, ""); - François Andrieux
2
我相当确定除了第一个成员之前没有填充以及每个单独类型正确对齐之外,您不能假设任何内容。据我所知,在成员之间或之后的填充是符合规范的(尽管看起来毫无意义)。 - Nir Friedman
1
@FrançoisAndrieux 我不确定它是否实际回答了Vector成员之间是否有填充的问题。 - W.F.
1
@W.F. 不行。如果 sizeof(Vector) 是三个浮点数,并且我们知道 Vector 至少包含 3 个浮点数,那么就不会有任何一个字节用于填充。 - Quentin
1
@Donnie,这还不错,因为用户可以借助编译器扩展来操纵它。 - Quentin
显示剩余6条评论
1个回答

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

你能提供标准中的引用吗?这是一个语言律师问题。 - user3624760
2
@Lyberta 通常不会有关于缺乏需求的引用。 - Caleth
有没有确保不会发生填充的方法?这感觉很重要,需要一个明确的答案。 - Passer By
@PasserBy,这里确实有一个明确的答案。填充是由实现定义的。就是这样。虽然我不确定这个答案中的第二句话是否同意我的看法,但这是一件好事。你想要控制填充是否发生?阅读你的实现文档即可。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接