C++ 类数组结构的填充

C++ 类数组结构的填充,c++,struct,language-lawyer,padding,C++,Struct,Language Lawyer,Padding,给定包含相同基本类型序列的结构,如下所示: struct Vector { float x; float y; float z; }; 它是否可以在成员之间添加填充?我得到了一个链接,上面说可以添加填充以实现对齐,但它在这种情况下适用吗?似乎没有技术上的原因使结构中的浮动与数组中的浮动对齐方式不同。但是在二进制级别上仍然缺少C++的标准化。 如果希望安全,则可以添加一个静态\u断言: static_assert(offsetof(Vector, y) - offseto

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

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

它是否可以在成员之间添加填充?我得到了一个链接,上面说可以添加填充以实现对齐,但它在这种情况下适用吗?

似乎没有技术上的原因使结构中的浮动与数组中的浮动对齐方式不同。但是在二进制级别上仍然缺少C++的标准化。 如果希望安全,则可以添加一个
静态\u断言

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

如果填充的引入对您来说有问题,您可以尝试使用
static\u assert
在编译时进行检查。例如,
static_断言(sizeof(Vector)==sizeof(float)*3,”。我很确定,除了第一个成员之前没有填充,并且每个单独的类型都正确对齐之外,您不能假设任何其他内容。成员之间或之后的填充是一致的(尽管看起来毫无意义)。@FrançoisAndrieux我不确定它是否真的回答
向量之间是否有填充members@W.F.不,不能。如果
sizeof(Vector)
是三个浮点数,并且我们知道
Vector
至少包含三个浮点数,那么这就不会留下一个字节用于填充。@Donnie这还不错,因为用户可以使用编译器扩展来操作它。你能提供标准中的引用吗?这是一个语言律师的问题。@Lyberta没有关于缺少要求的引述,当然也没有办法确保没有填充?“这感觉很重要,足以保证有一个明确的答案。”路人说,有一个明确的答案。填充是实现定义的。到此为止。而且,虽然我不确定这个答案中的第二句是否与我相符,但这是一件好事。您想要某种方法来控制是否发生填充?请阅读您的实现文档。