【问题标题】:C++ Linking with Methods Defined in the Class DefinitionC++ 与类定义中定义的方法的链接
【发布时间】:2011-09-07 23:20:53
【问题描述】:

出于好奇,如果您将方法定义放在头文件中的类定义中,并且编译器没有内联它,那么该方法在链接器阶段放入哪个或哪些目标文件以进行访问?是不是放在每一个包含头部的 .obj 文件中,然后在链接阶段就扔掉多余的副本?

【问题讨论】:

  • 您可以随时尝试使用“objdump”和“nm”等实用程序来了解这一点。 :)
  • 类定义中的成员函数定义是内联定义的(特别是标准的 9.3/2),就像声明了inline一样。

标签: c++ class methods linker


【解决方案1】:

是否将其放入包含标头的每个 .obj 文件中,然后在链接器阶段丢弃额外的副本?

一般来说,是的。 See this paper.

【讨论】:

    【解决方案2】:

    这取决于编译器,但 GCC 至少会尝试将它放在与第一个非内联成员相同的目标文件中。如果所有成员都是内联的,那么在每个需要该函数的目标文件中都会有一个副本(不一定是所有包含类定义的文件),并且在链接过程中会丢弃额外的副本。

    【讨论】:

      【解决方案3】:

      如果编译器拒绝内联某些在类主体中内联定义或在类主体之外定义为inline 函数的成员函数,编译器将在其中插入该函数的编译版本每个使用该函数的 .obj 文件。请注意,这与插入标头中声明的每个函数的编译版本不同。有问题的文件必须调用该(假定的)内联函数。

      是的,链接器会删除重复的条目。在符号表中为这些内联函数生成的符号具有弱链接。与未内联的函数相比:它们具有正常的链接,如果其中一个被复制,则您有未定义的行为。典型的反应是链接器抱怨然后死掉。

      【讨论】:

        猜你喜欢
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2010-11-10
        • 2015-11-01
        • 2020-08-23
        • 2014-05-11
        相关资源
        最近更新 更多