【问题标题】:Compiler optimizations of inlined functions in C++C++中内联函数的编译器优化
【发布时间】:2011-09-09 15:14:04
【问题描述】:

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

这是一个明显的例子:

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

【问题讨论】:

  • 为什么不自己比较程序集呢?
  • 你问'我在哪里可以得到我的编译器所做的一些“基本”优化的列表?'不用说你的编译器是什么。
  • @Kerrek SB:因为我不习惯组装
  • @Simon:如果您对编译目标不满意,您希望什么样的答案对您有用?优化通常只体现在生成的目标代码中...
  • @Julian:我很确定几乎所有优秀的编译器都在做大致相同的优化。至少在这样的简单情况下(我使用的是 clang 和 gcc)

标签: c++ compiler-optimization inlining


【解决方案1】:

我假设 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 (您可以点击链接了解更多信息)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        相关资源
        最近更新 更多