找出哪些函数是内联的 < >在编译C++与GCC 4.4或MSVC时,当函数被内嵌时,编译器可以发出消息吗?< /P> < P>用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

找出哪些函数是内联的 < >在编译C++与GCC 4.4或MSVC时,当函数被内嵌时,编译器可以发出消息吗?< /P> < P>用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,c++,visual-c++,g++,inline,C++,Visual C++,G++,Inline,与公正 0.00 0.00 0.00 1 0.00 0.00 global constructors keyed to main 好问题,但我对你的动机很好奇。我重新构造了代码,将大量代码从头文件移动到cpp文件,现在运行速度变慢了。我想看看LINING中的函数数量是否有差异。您是如何构建的?发布还是调试?您为Visual Studio指定了什么/OPT?使用GCC-O3-march=native-DNDEBUG-msse2-std=c++0x

与公正

0.00      0.00     0.00        1     0.00     0.00  global constructors keyed to main

好问题,但我对你的动机很好奇。我重新构造了代码,将大量代码从头文件移动到cpp文件,现在运行速度变慢了。我想看看LINING中的函数数量是否有差异。您是如何构建的?发布还是调试?您为Visual Studio指定了什么/OPT?使用GCC-O3-march=native-DNDEBUG-msse2-std=c++0xFWIW,可能也值得尝试一下。我听说它可以走任何一条路取决于代码的性质。。。(性质发生了重大变化)FWIW,根据函数的使用方式,编译器可能会内联一些实例,而不是其他实例。如果程序足够大,就需要更复杂的东西。我想知道是否有剖析器报告了类似的情况(gprof似乎没有)。可能是一个有用的写作工具。谢谢。我可以看到编译后的二进制文件之间的差异。仅头部版本似乎内联了更多函数。我以前在gprof上运行过(使用-pg编译),两者之间没有太大区别。我刚刚在callgrinds上运行了这些程序,并且只有header版本似乎在很多函数中内联了,因为它们没有显示在callgrinds输出中。
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