C ++内联函数阻止复制?

时间:2012-12-10 18:39:01

标签: c++ inline

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

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

int main () {

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

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

  return 0; 
}

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

2 个答案:

答案 0 :(得分:5)

我的编译器(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()没有任何关系:如果我重复两行两次,只有四个语句中的最后一个具有相反的指令顺序。这让我觉得这个工件可能与管道优化器或某种性质有关。

答案 1 :(得分:1)

绝对应该是一样的。

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

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