繁体   English   中英

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

[英]Compiler optimizations of inlined functions in C++

当内联使用在参数中使用指针的函数时,编译器是否在优化过程中删除了间接寻址? 当然,这是有道理的。

这是一个明显的例子:

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;
}

这种情况是微不足道的,但是如果编译器进行了优化,那么在某些情况下它不会呢?

好处 :我在哪里可以获得编译器进行的一些“基本”优化的列表?

附:我只是很好奇

我假设使用的是GCC,因此您要查找的链接是http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

并引用:(这可能不是您得到的)

-findirect-inlining由于以前的内联,Inline也可以发现在编译时已知的间接调用。 仅当通过-finline-functions或-finline-small-functions选项打开内联自身时,此选项才有效。

 Enabled at level -O2. 

Visual Studio编译器(包括C ++)的等效文档http://msdn.microsoft.com/zh-cn/library/k1ack8f1.aspx (您可以单击链接获取更多信息)

一个好的编译器可以做到这一点。 但是,这将是一个分为两个阶段的过程。 首先,它将内联函数。 然后,下一个阶段可以意识到该结构的唯一用途是暂时保留name并消除它。

是的,以我的经验,这对于指针(C和C ++)和引用(当然也仅是C ++)都是正确的-几乎任何体面的编译器都会优化冗余的间接寻址。 甚至Visual Studio也会这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM