如果将功能的非常简单的定义移动到.cpp,则编译时间的减少是多少
How much is reduction in compile time if move very simple definition of function to .cpp?
我已经被一些同事(比我聪明)告诉我,在某些情况下,将实现(定义)移动实施(定义)可以减少编译时间 - 在某些情况下,我应该这样做。
经过很多重构,我相信这是真的。
现在,我计划也将实施非常简单的功能。(.h-> .cpp)
void f(int index){
return database[index*2]; //<--- contain trivial algorithm like this
}
问题
确定收益多少的因素是什么?
更具体地: -
do 编译保存的时间量取决于
字符数量(排除评论)我搬到.cpp或...
复杂性(此处不表示o(n)算法的算法或... 其他?
我应该将这种简单功能的定义移至.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.cpp
和D.cpp
编译B.h
的大型代码。
将fb
的定义移动到b.cpp
后,我认为C.cpp
和D.cpp
的编译要容易得多。
确定收益多少的因素是什么?
减少编译时间的主要因素取决于包含夹层代码的标头的其他数量。您提到的其他因素只是无关紧要的。
如果您在定义中更改某些内容需要重新编译更多的文件,那么仅在单个.cpp
文件中更改定义。
- 我应该将这种简单功能的定义移至.cpp吗? (仅关注性能和编译时间,而不关心可维护性或可读性)
不,我上面说的是指非琐碎的东西。如果您具有如此简单的功能定义,并且不太可能将来会更改,则可以将其留在标题文件中。
答案可以简单而不简单。
简单答案:
-
将非平凡函数的实现放在源文件中,这有很多优点,而不仅仅是汇编时间。
-
离开标题文件中琐碎功能的实现并在内联函数中进行非会员函数,编译时间将不会显着差异,甚至还有更好的优化可能性。
不太简单:
-
将非平凡的功能放在源文件中是专门完成的,因此类似于代码接口的标头文件更可读,不必包含实现所需的所有包含的内容,可以防止相互互动循环问题和最重要的汇编时间。
-
将琐碎的功能放在标题文件中,让编译器在编译时(而不是链接时间)进行更好的优化,因为它在呼叫点知道该功能的功能,因此它更了解何时在内联行动和重新订购代码(有关链接时间优化,请参见此处)。
-
模板仍应始终在标题文件中。对于某些复杂的功能,可以将非模板零件纳入并放入源文件中,但可以放心。
-
出于封装原因,最好在源文件中声明助手功能和助手类。
-
使用PIMPL-constructs时,琐碎的委托函数必须在源文件中,因为只有在那里,PIMPL才完全知道。
因此,最后订购代码可能会导致更好的编译时间,但这不是主要原因。
如果您调用此函数在.h中,则它将获得您的#include insun in unception in yous以找到它,因为#include仅给出参考。
如果您的功能的身体在.cpp
中,则编译器会更容易我建议您检查一下。它也帮助了我。
可以使用哪些技术来加快C 汇编时间?
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- C++常量数组的编译时间较长
- 编译时间文本到数字转换 (atoi)
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- DLLexport 类模板实例(专用化),减少了仅标头模板库的编译时间
- 为什么这段代码需要这么长时间才能用 g++ 编译?
- 替换枚举以最大化编译时间检查的最佳方法
- 不同C++功能的编译时间
- 在预编译标头中实例化模板会缩短编译时间吗?
- 使用 SCons 提取每个编译单元的编译时间
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- std :: Invoke_result_t编译时间语法错误
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 模板;constexpr;编译时间
- 如何实现声明功能-C 11,编译时间
- 如何减少编译时间:在包含未触及的头文件的情况下
- 当(执行时间)>>>(编译时间)时,多个编译单元是否仍然值得?