代码之家  ›  专栏  ›  技术社区  ›  Aman Aggarwal Charlie

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

  •  4
  • Aman Aggarwal Charlie  · 技术社区  · 16 年前

    考虑一下:

    class Foo{
          void func1(){
                /*func1 code*/
    
          }
    
          void func2(){
                /*func2 code*/
    
          }
    
    
    };
    

    案例1:foo.h中的foo类

    案例二:foo类在foo.h和foo.cpp之间很好地分离。

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

    我的问题是…情况1会导致更大的二进制数吗?

    5 回复  |  直到 12 年前
        1
  •  2
  •   AnT stands with Russia    16 年前

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

        2
  •  2
  •   Xeor    16 年前

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

    另外,rtti info和vtables也使用相同的场景。

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

        3
  •  1
  •   Mark Ransom    16 年前

    如果您在头中有代码定义,编译器可能会在包含.h的任何时候创建每个函数的冗余副本。这些冗余副本也可能会从链接器触发错误,因此除了内联函数外,通常不赞成这种做法。

        4
  •  1
  •   Malkocoglu    16 年前

    如果头中的函数声明为 静止的 ,而不是“是”,包含该头文件的每个模块(源文件)将在对象文件中存储该函数的副本,最终可执行文件的大小将更大…

        5
  •  0
  •   Jonathan Leffler    16 年前

    如果函数的代码包含在头文件中,那么编译器可以使用它为每个单独的源文件在对象代码中定义函数,或者直接在调用函数的地方嵌入函数代码。取决于编译器和链接器以及C++的支持,这可能会使您拥有比单独定义的函数更大的代码。如果内联函数足够小,可以通过避免函数调用开销来节省空间。然而,这样的功能必须非常小。