【发布时间】:2011-04-05 05:43:02
【问题描述】:
假设我有以下代码:
int f() {
int foo = 0;
int bar = 0;
foo++;
bar++;
// many more repeated operations in actual code
foo++;
bar++;
return foo+bar;
}
将重复的代码抽象成一个单独的函数,我们得到
static void change_locals(int *foo_p, int *bar_p) {
*foo_p++;
*bar_p++;
}
int f() {
int foo = 0;
int bar = 0;
change_locals(&foo, &bar);
change_locals(&foo, &bar);
return foo+bar;
}
我希望编译器内联change_locals 函数,并将生成的代码中的*(&foo)++ 等内容优化为foo++。
如果我没记错的话,获取局部变量的地址通常会阻止一些优化(例如,它不能存储在寄存器中),但是当没有对地址进行指针运算并且它不会从功能?对于更大的change_locals,如果将其声明为inline(MSVC 中的__inline)会有所不同吗?
我对 GCC 和 MSVC 编译器的行为特别感兴趣。
【问题讨论】:
-
最好的办法是尝试检查发出的程序集。
标签: c micro-optimization