【发布时间】:2012-04-21 14:14:23
【问题描述】:
当我将 -O2 标志传递给 gcc 时,gcc 会优化代码,但我想知道如果我将所有源文件编译为目标文件然后链接它们,它实际上能做到这一点。
这是一个例子:
// in a.h
int foo(int n);
// in foo.cpp
int foo(int n) {
return n;
}
// in main.cpp
#include "a.h"
int main(void) {
return foo(5);
}
// code used to compile it all
gcc -c -O2 foo.cpp -o foo.o
gcc -c -O2 main.cpp -o main.o
gcc -O2 foo.o main.o -o executable
通常,gcc 应该内联foo,因为它是一个小函数,而-O2 启用-finline-small-functions,对吗?但是在这里,gcc 在创建目标文件之前只看到foo 和main 的代码,所以不会有这样的优化,对吧?那么,这样编译真的会让代码变慢吗?
不过,我也可以这样编译:
gcc -O2 foo.cpp main.cpp -o executable
这样会更快吗?如果没有,这样会更快吗?
// in foo.cpp
int foo(int n) {
return n;
}
// in main.cpp
#include "foo.cpp"
int main(void) {
return foo(5);
}
编辑:我查看了objdump,它的反汇编代码显示只有#include "foo.cpp" 有效。
【问题讨论】:
-
将小函数放入.h文件中,注解为
inline。 (虽然为了完全通用,您还需要使用我忘记的语法定义“hashome”属性。) -
@HotLicks:你的意思是,把函数包括它们的主体,而不仅仅是头文件,放到 .h 文件中?
-
是的,这就是方法上的“内联”注释的目的。
标签: c++ optimization gcc