當使用GCC 4.4或MSVC編譯C++時,是否有可能讓函數內聯時編譯器發出消息?找出哪些函數被內聯
回答
隨着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
FWIW具有相同的性能,這取決於函數的使用方式,編譯器可能會內聯一些實例而不是其他人。如果程序足夠大,則需要更復雜的東西。 – Cogwheel 2010-07-15 03:04:47
確實。我想知道是否有任何配置文件報告類似的情況(gprof似乎沒有)。可能是一個有用的小工具來編寫。 – Cubbi 2010-07-15 03:30:27
謝謝。我可以在編譯的二進制文件中看到不同之處。僅頭部版本似乎已內嵌更多功能。我之前在gprof上運行過(用-pg編譯),兩者之間差別不大。我只是在callgrind上運行這些程序,並且只有頭文件似乎內嵌了很多函數,因爲它們不會顯示在callgrinds輸出中。 – 2010-07-15 04:06:23
- 1. 如何找出哪些函數被調用?
- 2. 如何找出什麼類被調用了哪些函數?
- 3. 找出哪些我NSButton被壓
- 4. 找出哪些項目已被刪除?
- 5. 找出內聯css來自哪裏
- 6. 確定哪些函數被調用
- 7. Django內聯,我怎麼知道哪些被編輯?
- 8. 找出使用某個包中的哪些函數
- 9. JavaScript:如何找出在事件上調用哪些函數?
- 10. 找出elisp中某個函數打開了哪些緩衝區?
- 11. 找出python中的類實例可以使用哪些函數?
- 12. 使用callgrind找出哪些函數是最密集的
- 13. 找出哪些是不表
- 14. 找出哪些iPhone版
- 15. 內聯函數
- 16. 內聯函數
- 17. 內聯函數
- 18. 查找哪些事件已被觸發
- 19. 找到哪些資源被過濾
- 20. 如何找出哪個函數被綁定到jquery事件時被調用?
- 21. 如何找出asp.net中的哪個函數有內存泄漏
- 22. 找出點擊哪個javascript函數...
- 23. 找出函數屬於哪個模塊
- 24. 如何找出哪些類最被引用?
- 25. 如何找出哪些文件正被另一個進程
- 26. 如何找出哪些文件在分支中被修改?
- 27. 的Rails 3如何找出哪些行動被觸發find_or_create
- 28. 找出哪些合併表格單元格會被點擊?
- 29. 如何找出哪些網格行被點擊了contextmenu?
- 30. 如何找出哪些文件/桶最常被公開下載?
好問題,但我很好奇,你的動機。 – Daniel 2010-07-15 00:59:33
我重新構造的代碼將大量代碼從頭文件移動到cpp文件,現在運行得更慢。我想看看內聯函數的數量是否有所不同 – 2010-07-15 01:14:36
你是如何建設的?發佈還是調試?你爲Visual Studio指定了什麼/ OPT? – 2010-07-15 01:49:31