1

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

这是一个明显的例子:

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

4

3 回答 3

5

我假设 GCC,所以你正在寻找的链接是http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

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

-findirect-inlining 内联也是间接调用,这些调用在编译时被发现是已知的,这要归功于先前的内联。仅当通过 -finline-functions 或 -finline-small-functions 选项打开内联本身时,此选项才有效。

Enabled at level -O2.

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

于 2011-09-09T15:18:41.440 回答
1

一个好的编译器会这样做。不过,这将是一个两阶段的过程。首先它将内联函数。稍后的阶段可能会意识到结构的唯一用途是暂时保持name和消除它。

于 2011-09-09T15:19:33.900 回答
1

是的,根据我的经验,指针(C 和 C++)和引用(当然只有 C++)都是如此——几乎任何体面的编译器都会优化掉多余的间接。甚至 Visual Studio 也能做到这一点。

于 2011-09-09T15:20:03.220 回答