当内联参数中的指针的函数被内联时,编译器是否在优化过程中删除了间接?当然有意义的时候..
这是一个明显的例子:
inline void say_hello (person* p) {
std::cout << "hello " << p->name << std::endl;
}
int main () {
person goldorak;
goldorak.name = "Goldorak";
say_hello(&goldorak);
return 0;
}
这种情况是微不足道的,但是如果编译器确实进行了优化,那么在某些情况下它不适用?
奖金:我在哪里可以获得编译器进行的一些“基本”优化列表?
Ps:我只是好奇
答案 0 :(得分:5)
我假设GCC, 所以你要找的链接是http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
引用:(这可能不是你得到的)
-findirect-内联 内联也发现了已知的间接调用 通过以前的内联编译时间。此选项有任何影响 只有当-finline-functions或者启用内联本身时 -finline-small-functions选项。
Enabled at level -O2.
Visual Studio编译器的等效文档(包括C ++) http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx (您可以点击链接获取更多信息)
答案 1 :(得分:1)
一个好的编译器会这样做。不过,这将是一个两阶段的过程。首先,它将内联函数。稍后阶段可以意识到结构的唯一用途是暂时保留name
并消除它。
答案 2 :(得分:1)
是的,根据我的经验,这对于指针(C和C ++)和引用(当然只是C ++)都是如此 - 几乎任何体面的编译器都会优化冗余间接。甚至Visual Studio都是这样做的。