【问题标题】:C++ do inline functions prevent copying?C ++内联函数是否防止复制?
【发布时间】:2012-12-10 18:39:00
【问题描述】:

假设编译器实际上内联了foo,这两个语句之间是否存在性能差异?

inline int foo (int val) {
  return val;
}

int main () {

  std::cout << foo(123) << std::endl;

  std::cout << 123 << std::endl;

  return 0; 
}

让我们忽略移动语义和复制省略可能产生的任何影响。

【问题讨论】:

  • 它们在我看来是一样的。您可以查看生成的程序集进行验证。

标签: c++ inline


【解决方案1】:

我的编译器 (gcc 4.7.2) 为两条语句生成几乎相同的代码:

_main:
LFB1018:
        pushq   %rbx
LCFI0:
        movq    __ZSt4cout@GOTPCREL(%rip), %rbx

; std::cout << foo(123) << std::endl;
        movl    $123, %esi
        movq    %rbx, %rdi
        call    __ZNSolsEi
        movq    %rax, %rdi
        call    __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

; std::cout << 123 << std::endl;
        movq    %rbx, %rdi
        movl    $123, %esi
        call    __ZNSolsEi
        movq    %rax, %rdi
        call    __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

        xorl    %eax, %eax
        popq    %rbx
LCFI1:
        ret

唯一的区别是前两条指令的顺序。我已经对其进行了实验,这种差异似乎与foo() 没有任何关系:如果我将这两行重复两次,则只有四个语句中的最后一个将指令顺序颠倒了。这让我觉得这个工件可能与管道优化器或类似的东西有关。

【讨论】:

  • 它确实交换了前两条指令;知道为什么吗?否则它们是相等的。
  • 为什么要保留%rbx?
【解决方案2】:

应该完全一样。

为确保确实如此,请使用 gcc 中的-S 标志生成汇编代码并手动比较这两行。

另外,请注意 inline 关键字只是对编译器的提示,编译器可能会选择忽略它。 This question 对使用内联有深入的讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多