我在Scott Meyers的Effective C++书中读到:
当你将一个函数内联时,你可以使编译器对函数体进行上下文特定的优化。这种优化是普通函数调用所无法实现的。
现在问题是:什么是上下文特定的优化,为什么需要它?
我在Scott Meyers的Effective C++书中读到:
当你将一个函数内联时,你可以使编译器对函数体进行上下文特定的优化。这种优化是普通函数调用所无法实现的。
现在问题是:什么是上下文特定的优化,为什么需要它?
int foo(int i)
{
if (i < 0) throw std::invalid_argument("");
return -i;
}
int bar()
{
int i = 5;
return foo(i);
}
foo
被单独编译,它必须包含比较和异常抛出代码。如果它被内联到bar
中,编译器会看到这段代码:int bar()
{
int i = 5;
if (i < 0) throw std::invalid_argument("");
return -i;
}
int bar()
{
return -5;
}
bool callee(bool a){
if(a) return false;
else return true;
}
void caller(){
if(callee(true)){
//Do something
}
//Do something
}
void caller(){
bool a = true;
bool ret;
if(a) ret = false;
else ret = true;
if(ret){
//Do something
}
//Do something
}
void caller(){
if(false){
//Do something
}
//Do something
}
然后是:
void caller(){
//Do something
}
现在该函数更小了,您不需要承担函数调用的开销,特别是(关于问题),也没有分支的成本。
假设这个函数是:
void fun( bool b) { if(b) do_sth1(); else do_sth2(); }
它在上下文中被称为预定义的false
参数。
bool param = false;
...
fun( param);
...
do_sth2();
我认为上下文特定优化并没有具体的含义,你可能找不到确切的定义。
一个很好的例子是某些类属性的经典getter,在不进行内联的情况下,程序必须执行以下操作:
eax
)eax
移动到局部变量而使用内联则可以跳过几乎所有的工作,直接将值移动到局部变量。
优化严格依赖于编译器,但很多事情都可能发生(变量分配可能被跳过,代码可能被重新排序等等...但你总是可以节省昂贵的调用/跳转指令。
更多关于优化的阅读在这里。