我一直在阅读 Scott Meyers 的Effective C++,更具体地说是关于内联的第 30 条。
所以我写了以下内容,试图用 gcc 4.6.3 进行优化
// test.h
class test {
public:
inline int max(int i) { return i > 5 ? 1 : -1; }
int foo(int);
private:
int d;
};
// test.cpp
int test::foo(int i) { return max(i); }
// main.cpp
#include "test.h"
int main(int argc, const char *argv[]) {
test t;
return t.foo(argc);
}
并使用以下替代方法生成相关组件:
g++ -S -I. test.cpp main.cpp
g++ -finline-functions -S -I. test.cpp main.cpp
就内联方法而言,这两个命令都生成了相同的程序集;我可以看到max()
方法体(也有一个cmpl
语句和相关的跳转)及其从foo()
.
我错过了一些非常明显的东西吗?我不能说我浏览了 gcc 手册页,但找不到任何相关的突出内容。
所以,我只是将-O3
默认情况下内联优化的优化级别提高到了,根据:
g++ -c -Q -O3 --help=optimizers | grep inline
-finline-functions [enabled]
-finline-functions-called-once [enabled]
-finline-small-functions [enabled]
不幸的是,这个优化的(如预期的那样)上面的代码片段几乎不存在了。
max()
不再存在(至少作为显式标记的装配块)并且foo()
已减少为:
_ZN4test3fooEi:
.LFB7:
.cfi_startproc
rep
ret
.cfi_endproc
我目前无法清楚地理解(并且超出了研究范围)。
理想情况下,我希望看到的是块max()
内部的汇编代码。foo()
有没有办法(通过命令行选项或使用不同的(非平凡的?)代码片段)来产生这样的输出?