当前位置:  开发笔记 > 编程语言 > 正文

GCC中的"空基优化"是否可配置?

如何解决《GCC中的"空基优化"是否可配置?》经验,为你挑选了1个好方法。

考虑以下类型:

  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搜索了一段时间,似乎找不到任何东西.



1> scobi..:

这总是发生.我在发现之前立即发布.也许发布的行为让我以不同的方式思考..

所以在我的问题中,样本有点过于简单了.它实际上更像是这样的:

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可能会出现此问题.

所以,我看到的不一致只是在我有上述模式的情况下.我从一个空结构派生的每个其他地方都可以.

很容易解决.感谢所有的评论和答案.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有