我一直在用Valgrind做一些測試,以瞭解函數如何被編譯器翻譯,並且發現由於沒有被內聯,有時候寫在不同文件上的函數與寫在同一個源文件中的函數相比性能差。爲什麼不將編譯器內聯函數寫入不同的源文件?
考慮到我有不同的文件,每個文件都包含與特定區域相關的函數,並且所有文件都共享一個聲明所有函數的通用頭文件,這是預期的嗎?
爲什麼當編譯器在不同的文件上編寫它們時,編譯器不會內聯它們,而是當它們在同一頁上時內聯?
如果此行爲開始導致性能問題,那麼建議採取的行動方案是什麼?在編譯之前手動將所有功能放在同一文件中?
例如:
//source 1
void foo(char *str1, char *str2)
{
//here goes the code
}
//source 2
void *bar(int something, char *somethingElse)
{
//bar code
foo(variableInsideBar, anotherVariableCreatedInsideBar);
return variableInsideBar;
}
樣品性能成本:
在不同的文件:29920
二者都在同一個文件:8704
對於更大的功能是不那麼明顯,但仍然發生。
即使在最高級別上進行了優化,它也會發生在頭上聲明的所有函數,並且同時編譯所有函數。 – 2013Asker
然後編譯器將源代碼編譯爲目標文件,他只查找這個c文件,並從頭文件中獲取具有函數聲明的常量。它不知道使用的函數的代碼,他只知道如何調用它們,並且稍後將鏈接器的信息留給鏈接該函數。它不能內聯該代碼,他甚至不知道在這個階段。如果你願意,你可以簡單地複製它。 – user2547526