C++ 如果将非常简单的函数定义移动到.cpp,编译时间会减少多少?

C++ 如果将非常简单的函数定义移动到.cpp,编译时间会减少多少?,c++,C++,一些同事(他们比我聪明)告诉我,在某些情况下,将实现(定义)移到头之外可以减少编译时间——在大多数情况下,我应该这样做 经过多次重构,我相信这是真的 现在,我也计划移动非常简单函数的实现。(.h->.cpp) C.h:- class B{ public: static void fb(){ //some complex code (e.g. 1000 lines) } }; #include "B.h" class C{ static void fc

一些同事(他们比我聪明)告诉我,在某些情况下,将实现(定义)移到头之外可以减少编译时间——在大多数情况下,我应该这样做

经过多次重构,我相信这是真的

现在,我也计划移动非常简单函数的实现。(.h->.cpp)

C.h:-

class B{
    public: static void fb(){  
        //some complex code (e.g. 1000 lines)
    }
};
#include "B.h"
class C{
    static void fc();
};
#include "B.h"
class D{
    static void fd();
};
C.cpp包含
fc()

D.h:-

class B{
    public: static void fb(){  
        //some complex code (e.g. 1000 lines)
    }
};
#include "B.h"
class C{
    static void fc();
};
#include "B.h"
class D{
    static void fd();
};
D.cpp包含
fd()的实现

在移动
fb
的定义之前,编译器必须为
C.cpp
D.cpp
编译大型
B.h

在将
fb
的定义移动到
b.cpp
之后,我认为
C.cpp
D.cpp
将更容易编译

决定收益多少的因素有哪些

减少编译时间的主要因素取决于有多少其他翻译单元包含带有内联代码的头。你提到的其他因素只是无关紧要

如果在定义中更改某些内容,则需要重新编译的文件将比仅在单个
.cpp
文件中更改定义的文件多得多

  • 我应该将这些简单函数的定义移到.cpp吗? (只关注性能和编译时,不关注可维护性或可读性)
  • 不,我上面说的是非琐碎的东西。如果您有这样简单的函数定义,并且将来不太可能对其进行更改,则可以将其保留在头文件中

    决定收益多少的因素有哪些

    减少编译时间的主要因素取决于有多少其他翻译单元包含带有内联代码的头。你提到的其他因素只是无关紧要

    如果在定义中更改某些内容,则需要重新编译的文件将比仅在单个
    .cpp
    文件中更改定义的文件多得多

  • 我应该将这些简单函数的定义移到.cpp吗? (只关注性能和编译时,不关注可维护性或可读性)

  • 不,我上面说的是非琐碎的东西。如果你有这么简单的函数定义,而且以后不太可能更改,你可以把它放在头文件中。

    如果你调用这个函数,它的主体在.h中,它会得到你的#include的引用以便找到它,因为#include只提供一个引用

    如果函数体位于.cpp中,编译器将更容易使用

    我建议你看看这个。这对我也有帮助


    如果调用此函数,它的主体在.h中,它将获得对您的#include的引用,以便找到它,因为#include只提供一个引用

    如果函数体位于.cpp中,编译器将更容易使用

    我建议你看看这个。这对我也有帮助


    答案可以简单,也可以不那么简单

    简单回答:

    • 将非平凡函数的实现放在源文件中,这有很多优点,不仅仅是编译时间

    • 将平凡函数的实现保留在头文件中,并使非成员函数内联,编译时间不会有显著差异,甚至有更好的优化可能性

    不那么简单:

    • 将非平凡函数放入源文件是专门做的,这样头文件(与代码的接口类似)更具可读性,不必包含实现所需的所有include,可以防止相互循环问题,而且具有更好的编译时间

    • 在头文件中放置一些简单的函数可以让编译器在编译时(相对于链接时)进行更好的优化,因为它在调用点知道函数的作用,所以它更清楚何时内联和重新排序代码(请参阅链接时优化)

    • 模板应始终位于头文件中。对于一些复杂的函数,非模板部分可能会被分解并放入源文件中,但这可能会很麻烦

    • 出于封装的原因,最好在源文件中完整地声明helper函数和helper类

    • 使用pimpl构造时,琐碎的委托函数必须在源文件中,因为只有在源文件中,pimpl才是完全已知的


    因此,对代码进行排序最终可以缩短编译时间,但这不应该是主要原因。

    答案可能很简单,也可能不那么简单

    简单回答:

    • 将非平凡函数的实现放在源文件中,这有很多优点,不仅仅是编译时间

    • 将平凡函数的实现保留在头文件中,并使非成员函数内联,编译时间不会有显著差异,甚至有更好的优化可能性

    不那么简单:

    • 将非平凡函数放入源文件是专门做的,这样头文件(与代码的接口类似)更具可读性,不必包含实现所需的所有include,可以防止相互循环问题,而且具有更好的编译时间

    • 在头文件中放置一些简单的函数可以让编译器在编译时(相对于链接时)进行更好的优化,因为它在调用点知道函数的作用,所以它更清楚何时内联和重新排序代码(请参阅链接时优化)

    • 模板应始终位于头文件中。对于一些复杂的函数,可以将非模板部分分解并放入