【问题标题】:"inline Methods Hidden" option in XCode4.XCode4 中的“内联方法隐藏”选项。
【发布时间】:2011-12-05 03:39:27
【问题描述】:

查看文档信息: 内联方法隐藏 GCC_INLINES_ARE_PRIVATE_EXTERN = 是 启用后,内联方法的外联副本被声明为“私有外部”。[GCC_INLINES_ARE_PRIVATE_EXTERN, -fvisibility-inlines-hidden

有谁知道它将如何影响 C++ 库?我的 iphone 项目基于 C++ 库,使用 google protobuf,我发现库内联函数不会被“内联方法隐藏”选项设置为 YES 触发的一些奇怪问题,实际上它是系统默认值,设置为 NO 它可以工作好吧,我不知道为什么?里面有什么秘密?

对这个话题感兴趣的朋友请分享和讨论,在此先感谢。

【问题讨论】:

    标签: c++ xcode inline build-settings


    【解决方案1】:

    秘密是唯一的定义规则。如果内联被隐藏,那么您最终可能会在每个图像中获得多个(私有)内联副本。

    理想情况下,您应该配置和使用所有内容,以便它能够使用一个定义规则运行,然后您可以启用私有外部作为优化(这可能不是在所有方面都很好,尤其是二进制大小)。您会喜欢这种方法,因为它遵循标准的模型。

    快速复习 ODR:

    // somewhere.hpp
    namespace MON {
    inline int cas(const int*,const int*,int*) {
        return dah_dum();
    }}
    
    // elsewhere.hpp
    namespace MON {
    inline int cas(const int*,const int*,int*) {
        return dum_dah();
    }}
    

    任何int MON::cas(const int*,const int*,int*) 引用不是全部或部分内联,但对int MON::cas(const int*,const int*,int*) 的函数调用可能会导致使用任一定义,无论哪个定义对TU 可见。链接器只保留一个定义,并且假定所有定义都相等。这很重要,因为如果每个被引用且可见的定义都会为每个翻译生成一个副本,那么您的二进制大小将会爆炸。

    如果在使用 ODR 规则时它“有效”,那么很可能您的目标文件中有给定符号的多个定义,并且由于编译器设置,您最终会引用不同的定义。如果您声明了一个非静态或在匿名命名空间中的内联,则所有源文件的定义应该相同。

    如果您将此与 C TU 混合使用,那么...它有不同的链接规则,只会使问题更加复杂。

    【讨论】:

    • 感谢您的回复。对于我发现一些奇怪的问题,库内联函数不会被“内联方法隐藏”选项设置为 YES 触发,为什么?也许需要进一步追踪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多