C ++中内联函数的编译器优化

时间:2011-09-09 15:14:05

标签: c++ compiler-optimization inlining

当内联参数中的指针的函数被内联时,编译器是否在优化过程中删除了间接?当然有意义的时候..

这是一个明显的例子:

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:我只是好奇

3 个答案:

答案 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都是这样做的。