C ++与类定义中定义的方法链接

时间:2011-06-03 16:38:56

标签: c++ class methods linker

为了好奇,如果将方法定义放在标题中的类定义中,并且编译器没有内联它,那么在链接器阶段期间该方法放入哪些对象文件进行访问?它是否放在包含标题的每个.obj文件中,然后在链接器阶段丢弃额外的副本?

3 个答案:

答案 0 :(得分:4)

  

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

总的来说,是的。 See this paper.

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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