[英]Function method definition in .cpp vs .h
為了減少工作中相當大的框架的編譯時間,我考慮將.h文件中的類方法定義移動到它們關聯的.cpp文件中,如果它們非常大或者需要包括編譯可以移動到關聯的文件。 cpp文件。 為清楚起見,下面是一個人為的例子(雖然Foo::inc
是一個很小的方法)
main.cpp :
#include "Foo.h"
int main(int argc, char** argv) {
Foo foo(argc);
foo.inc();
return foo.m_argc;
}
之前是Foo.h(還不需要Foo.cpp) :
class Foo {
public:
int m_argc;
Foo (int argc) : m_argc(argc) {}
void inc() { m_argc++; }
};
Foo.h之后 :
class Foo {
public:
int m_argc;
Foo (int argc) : m_argc(argc) {}
void inc();
};
Foo.cpp :
#include "Foo.h"
void Foo::inc() { m_argc++; }
很久以前,一位同事提到可能存在導致運行時性能下降的情況。 我在谷歌上尋找這個案子,但似乎無法找到它,這個問題的接受答案是我能找到的最接近的答案,但它沒有給出案例,只是提到它可能發生: 從標題中移動內聯方法文件到.cpp文件
在旁注中,我對一個方法明確使用inline
的情況不感興趣,我上面鏈接的答案就是我能找到的最接近我想要的內容
什么情況(如果有的話)可能導致運行時間減慢?
你的原始方法void inc() { m_argc++; }
void inc() { m_argc++; }
是自動inline
,因此編譯器允許更換與內嵌版本的電話。
一旦將方法移出類定義到模塊,此方法就不再inline
,內聯擴展不會發生,標准方法調用就在那里,結果可能會更慢。
減少頭依賴性始終是減少編譯時間的好主意。 它是列表中的頂級項目之一,例如可以使用哪些技術來加速C ++編譯時間?
我建議 - 如果還沒有完成 - 通過剖析C ++編譯過程來了解占用編譯時間的主要參與者
還有助手可以對include依賴項進行排序,請參閱C ++中的Automate #include refactoring
關於將代碼移動到源文件會降低運行時性能的問題:這取決於。 一般來說,如果在頭文件中有函數,可以說你給編譯器一個內聯的機會。
我想引用C ++ FAQ - Inlining :
內聯函數可以提高性能嗎?
是的,不是。 有時。 也許。
沒有簡單的答案。 內聯函數可能會使代碼更快,但可能會使代碼變慢。 它們可能會使可執行文件更大,它們可能會使它更小。 他們可能會導致顛簸,他們可能會阻止顛簸。 它們可能並且通常與速度完全無關。
編譯器(以及后來的鏈接器)對它的作用取決於您使用的編譯器工具鏈以及您提供的編譯器 / 鏈接器選項。
查看所有內聯時發生的事情- 使用GNU編譯器集合 :
... GCC沒有在不優化的情況下內聯任何功能......
一些參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.