考虑一下:
class Foo{
void func1(){
/*func1 code*/
}
void func2(){
/*func2 code*/
}
};
案例1:Foo.h中的Foo类
案例2:Foo.h和Foo.cpp
中的Foo类很好地分离其他各种cpp文件包括Foo.h
我的问题是......案例1是否会导致更大的二进制文件?
答案 0 :(得分:2)
如果编译器决定不内联这些函数,并为它们生成单独的主体,则这些主体将出现在使用它们的每个目标文件中,但是具有链接器的特殊标志 - “弱符号”。当链接器找到此标志时,它会将具有该名称的所有符号组合成一个结果符号(如果这些符号的主体或大小不同,它可能会产生错误消息)
此外,RTTI信息和vtables也使用相同的方案。
对于动态库,弱符号连接可能在运行时发生,如果它们使用相同的类。
答案 1 :(得分:2)
也许它会,也许不会。它实际上与头文件无关。这里重要的是您的成员函数在类定义中定义。当成员函数被定义为这样时,它们被视为内联函数。如果编译器决定不实际内联对这些函数的任何调用,则不会对代码大小产生任何影响。如果编译器决定内联任何(或所有)调用,答案将是“它取决于”。内联对小函数的调用可能会导致代码大小增加以及代码大小减小。这完全取决于函数本身和编译器的功能(具体是优化功能)。
答案 2 :(得分:1)
如果标题中包含代码定义,则只要包含.h,编译器就可以创建每个函数的冗余副本。这些冗余副本也可能会触发链接器的错误,因此除内联函数外,通常不赞成这种做法。
答案 3 :(得分:1)
如果标题中的函数声明为 static ,则为yes,包含该头文件的每个模块(源文件)将在目标文件和最终可执行文件中存储该函数的副本会更大......
答案 4 :(得分:0)
如果函数代码包含在标题中,则编译器可以使用它来为每个单独的源文件定义目标代码中的函数,或者将函数代码直接嵌入到调用函数的位置。根据您的编译器和链接器以及对C ++的支持,这可能会给您留下比单独定义的函数更大的代码。如果内联函数足够小,则可以通过避免函数调用开销来节省空间。但是,这些功能必须非常小。