编译器是否取消内联?
Do Compilers Un-Inline?
众所周知,编译器工具带中最强大的工具是将函数内联到它们的调用站点中。但是反过来呢?如果是这样,完成了吗?什么时候?例如给定:
void foo(int x)
{
auto y = bar(x);
baz(y);
}
void bop()
{
int x;
auto y = bar(x);
baz(y);
}
编译器将其抽象为
是否有意义
void qux(int x)
{
auto y = bar(x);
baz(y);
}
void foo(int x)
{
qux(x);
}
void bop()
{
int x;
qux(x);
}
是的,例如 LLVM 有一个 MachineOutliner 优化过程。
当大纲部分为 [[unlikely]]
时,即使没有重复代码,大纲也有意义。函数调用是一个损失,但不太可能,而另一方面更有可能的代码可以放入缓存。
编译器也可能假设异常不太可能,并概述 catch
。
众所周知,编译器工具带中最强大的工具是将函数内联到它们的调用站点中。但是反过来呢?如果是这样,完成了吗?什么时候?例如给定:
void foo(int x)
{
auto y = bar(x);
baz(y);
}
void bop()
{
int x;
auto y = bar(x);
baz(y);
}
编译器将其抽象为
是否有意义void qux(int x)
{
auto y = bar(x);
baz(y);
}
void foo(int x)
{
qux(x);
}
void bop()
{
int x;
qux(x);
}
是的,例如 LLVM 有一个 MachineOutliner 优化过程。
当大纲部分为 [[unlikely]]
时,即使没有重复代码,大纲也有意义。函数调用是一个损失,但不太可能,而另一方面更有可能的代码可以放入缓存。
编译器也可能假设异常不太可能,并概述 catch
。