2010-07-15 43 views
11

當使用GCC 4.4或MSVC編譯C++時,是否有可能讓函數內聯時編譯器發出消息?找出哪些函數被內聯

+0

好問題,但我很好奇,你的動機。 – Daniel 2010-07-15 00:59:33

+0

我重新構造的代碼將大量代碼從頭文件移動到cpp文件,現在運行得更慢。我想看看內聯函數的數量是否有所不同 – 2010-07-15 01:14:36

+0

你是如何建設的?發佈還是調試?你爲Visual Studio指定了什麼/ OPT? – 2010-07-15 01:49:31

回答

2

隨着G ++,我不認爲你可以使G ++報告,但你可以檢查與任何工具,可以顯示符號,nm例如生成的二進制文件:

#include <iostream> 
struct T { 
     void print() const; 
}; 
void T::print() const { std::cout << " test\n" ; } 
int main() 
{ 
     T t; 
     t.print(); 
} 

~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc 
~ $ nm test | grep print 
0000000000400800 t _GLOBAL__I__ZNK1T5printEv 
0000000000400830 T _ZNK1T5printEv 

VS

#include <iostream> 
struct T { 
     void print() const { std::cout << " test\n" ; } 
}; 
int main() 
{ 
     T t; 
     t.print(); 
} 
~ $ g++ -O3 -Wall -Wextra -pedantic -o test test.cc 
~ $ nm test | grep print 

(在第二種情況下沒有來自nm的輸出)

編輯: 另外,分析器可能是有用的。 gprof的節目,在這兩個例子:

0.00  0.00  0.00  1  0.00  0.00 global constructors keyed to _ZNK1T5printEv 
0.00  0.00  0.00  1  0.00  0.00 T::print() const 

主場迎戰剛剛

0.00  0.00  0.00  1  0.00  0.00 global constructors keyed to main 
+5

FWIW具有相同的性能,這取決於函數的使用方式,編譯器可能會內聯一些實例而不是其他人。如果程序足夠大,則需要更復雜的東西。 – Cogwheel 2010-07-15 03:04:47

+0

確實。我想知道是否有任何配置文件報告類似的情況(gprof似乎沒有)。可能是一個有用的小工具來編寫。 – Cubbi 2010-07-15 03:30:27

+0

謝謝。我可以在編譯的二進制文件中看到不同之處。僅頭部版本似乎已內嵌更多功能。我之前在gprof上運行過(用-pg編譯),兩者之間差別不大。我只是在callgrind上運行這些程序,並且只有頭文件似乎內嵌了很多函數,因爲它們不會顯示在callgrinds輸出中。 – 2010-07-15 04:06:23