如果将功能的非常简单的定义移动到.cpp,则编译时间的减少是多少

How much is reduction in compile time if move very simple definition of function to .cpp?

本文关键字:时间 编译 多少 非常 功能 简单 定义 如果 移动 cpp      更新时间:2023-10-16

我已经被一些同事(比我聪明)告诉我,在某些情况下,将实现(定义)移动实施(定义)可以减少编译时间 - 在某些情况下,我应该这样做。

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

现在,我计划也将实施非常简单的功能。(.h-> .cpp)

void f(int index){
    return database[index*2];  //<--- contain trivial algorithm like this
}

问题

确定收益多少的因素是什么?

更具体地: -

  1. do 编译保存的时间量取决于

    • 字符数量(排除评论)我搬到.cpp或...

    • 复杂性(此处不表示o(n)算法的算法或...

    • 其他?

  2. 我应该将这种简单功能的定义移至.cpp?
    (仅关注性能和编译时间,不关心可维护性或可读性)

编辑:详细的示例

考虑此代码。

b.h : -

class B{
    public: static void fb(){  
        //some complex code (e.g. 1000 lines)
    }
};

c.h : -

#include "B.h"
class C{
    static void fc();
};

c.cpp 包含fc()

的实现

d.h : -

#include "B.h"
class D{
    static void fd();
};

d.cpp 包含fd()

的实现

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

fb的定义移动到b.cpp后,我认为C.cppD.cpp的编译要容易得多。

确定收益多少的因素是什么?

减少编译时间的主要因素取决于包含夹层代码的标头的其他数量。您提到的其他因素只是无关紧要的。

如果您在定义中更改某些内容需要重新编译更多的文件,那么仅在单个.cpp文件中更改定义。

  1. 我应该将这种简单功能的定义移至.cpp吗? (仅关注性能和编译时间,而不关心可维护性或可读性)

不,我上面说的是指非琐碎的东西。如果您具有如此简单的功能定义,并且不太可能将来会更改,则可以将其留在标题文件中。

答案可以简单而不简单。

简单答案:

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

  • 离开标题文件中琐碎功能的实现并在内联函数中进行非会员函数,编译时间将不会显着差异,甚至还有更好的优化可能性。

不太简单:

  • 将非平凡的功能放在源文件中是专门完成的,因此类似于代码接口的标头文件更可读,不必包含实现所需的所有包含的内容,可以防止相互互动循环问题和最重要的汇编时间。

  • 将琐碎的功能放在标题文件中,让编译器在编译时(而不是链接时间)进行更好的优化,因为它在呼叫点知道该功能的功能,因此它更了解何时在内联行动和重新订购代码(有关链接时间优化,请参见此处)。

  • 模板仍应始终在标题文件中。对于某些复杂的功能,可以将非模板零件纳入并放入源文件中,但可以放心。

  • 出于封装原因,最好在源文件中声明助手功能和助手类。

  • 使用PIMPL-constructs时,琐碎的委托函数必须在源文件中,因为只有在那里,PIMPL才完全知道。

因此,最后订购代码可能会导致更好的编译时间,但这不是主要原因。

如果您调用此函数在.h中,则它将获得您的#include insun in unception in yous以找到它,因为#include仅给出参考。

如果您的功能的身体在.cpp

中,则编译器会更容易

我建议您检查一下。它也帮助了我。

可以使用哪些技术来加快C 汇编时间?