考虑以下类型:
struct A {}; struct B : A { int i; };
sizeof(A) > 0
按照标准的要求.
sizeof(B)
由于空基优化应该是4.然而在GCC 4.1.1上它是5(我在这方面使用了一包1).并且不一致 - 我的一些文件正在获取它,有些则没有.不能确定差异是什么,我们有一个很大的优点.
在我使用的其他三个编译器上(由Microsoft和Freescale),我没有这个问题.根据这篇文章,空基优化显然是可选的.
在GCC 4.1.1中是否有编译器选项或编译指示来调整它?我可以解决这个问题,但我想先了解一下发生了什么.我用Google搜索了一段时间,似乎找不到任何东西.
这总是发生.我在发现之前立即发布.也许发布的行为让我以不同的方式思考..
所以在我的问题中,样本有点过于简单了.它实际上更像是这样的:
struct Base {}; struct C1 : Base { int i; } struct C2 : Base { C1 c; int i; }
sizeof(C1)在所有平台上都正确为4,但在GCC上sizeof(C2)为9而不是8.并且......根据我在原始问题中链接的文章的最后一点,显然GCC是唯一能够做到正确的事情.我会引用它(来自Nathan Meyers):
根据编译器必须遵守的ABI规范,可能有一整套相关的"空子对象"优化.(Jason Merrill多年前向我指出了其中的一些.)例如,考虑(空)类型A,B和C的三个结构成员,以及第四个非空的结构成员.一致地说,他们可以占据相同的地址,只要它们彼此之间没有任何共同基础或与包含类别相同.实践中常见的问题是让类的第一个(或唯一的)成员派生自与类相同的空基.编译器必须插入填充,以便它们两个子对象具有不同的地址.这实际上发生在具有interator成员的迭代器适配器中,两者都派生自std :: iterator.不谨慎实施的标准std :: reverse_iterator可能会出现此问题.
所以,我看到的不一致只是在我有上述模式的情况下.我从一个空结构派生的每个其他地方都可以.
很容易解决.感谢所有的评论和答案.