【发布时间】:2018-05-09 23:46:48
【问题描述】:
假设我有一个结构,其中包含其他未打包的结构:
struct ContainerOfNonPacked
{
NonPacked1 first;
NonPacked2 second;
};
然后我有一个结构,其中包含其他打包的结构:
struct ContainerOfPacked
{
Packed1 first; // declaration of struct had __attribute__((packed))
Packed2 second; // ditto
};
第一个不会被编译器打包(即不能保证结构内不会有“洞”)。它可能巧合地没有漏洞,但这不是问题所在。
第二个包含打包结构的容器呢?是否有任何保证一个结构仅由作为其字段的打包结构组成的结构本身是打包的?
【问题讨论】:
-
这取决于实现 - 没有“标准 C++”答案。如果
first和second有不同的对齐要求,那么包含结构可能在两个成员之间有填充,即使它们都被打包了。 -
我的意思是第一个案例“不保证打包”。我知道,一般来说,总是有可能碰巧有一个打包的结构,但这不是我想要的。第二种情况实际上似乎可以保证被打包(见下面的答案):但我不是很清楚,如果你有一个更权威的答案,我会喜欢。
-
如果您知道这是实现定义的,您介意写一个答案吗?这是非常有用的信息,尤其是因为这里唯一的答案仅使用了一个示例。谢谢!