簡體   English   中英

.cpp與.h中的函數方法定義

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM