头文件中的代码是否增加了二进制大小?

时间:2009-10-16 05:52:00

标签: c++ binary executable

考虑一下:

class Foo{
      void func1(){
            /*func1 code*/

      }

      void func2(){
            /*func2 code*/

      }


};

案例1:Foo.h中的Foo类

案例2:Foo.h和Foo.cpp

中的Foo类很好地分离

其他各种cpp文件包括Foo.h

我的问题是......案例1是否会导致更大的二进制文件?

5 个答案:

答案 0 :(得分:2)

如果编译器决定不内联这些函数,并为它们生成单独的主体,则这些主体将出现在使用它们的每个目标文件中,但是具有链接器的特殊标志 - “弱符号”。当链接器找到此标志时,它会将具有该名称的所有符号组合成一个结果符号(如果这些符号的主体或大小不同,它可能会产生错误消息)

此外,RTTI信息和vtables也使用相同的方案。

对于动态库,弱符号连接可能在运行时发生,如果它们使用相同的类。

答案 1 :(得分:2)

也许它会,也许不会。它实际上与头文件无关。这里重要的是您的成员函数在类定义中定义。当成员函数被定义为这样时,它们被视为内联函数。如果编译器决定不实际内联对这些函数的任何调用,则不会对代码大小产生任何影响。如果编译器决定内联任何(或所有)调用,答案将是“它取决于”。内联对小函数的调用可能会导致代码大小增加以及代码大小减小。这完全取决于函数本身和编译器的功能(具体是优化功能)。

答案 2 :(得分:1)

如果标题中包含代码定义,则只要包含.h,编译器就可以创建每个函数的冗余副本。这些冗余副本也可能会触发链接器的错误,因此除内联函数外,通常不赞成这种做法。

答案 3 :(得分:1)

如果标题中的函数声明为 static ,则为yes,包含该头文件的每个模块(源文件)将在目标文件和最终可执行文件中存储该函数的副本会更大......

答案 4 :(得分:0)

如果函数代码包含在标题中,则编译器可以使用它来为每个单独的源文件定义目标代码中的函数,或者将函数代码直接嵌入到调用函数的位置。根据您的编译器和链接器以及对C ++的支持,这可能会给您留下比单独定义的函数更大的代码。如果内联函数足够小,则可以通过避免函数调用开销来节省空间。但是,这些功能必须非常小。