为什么调用lambda函数比调用常规函数

时间:2015-10-07 19:46:07

标签: c++11 lambda

#include <iostream>
#include <ctime>

#define TIME(t) {std::cout << ((double)(clock() - (t)) / CLOCKS_PER_SEC);}

volatile long int limit = 10000000000;

void l2(int& a) {a++;}

void f(int& a)
{
  auto l1 = [&a]()
  {
    a++;
  };

  clock_t clk = clock();
  for(int i=0;i<limit;i++)
  {
    l1();
  }
  TIME(clk) // 4.07 s

  a=5;
  clk = clock();
  for(int i=0;i<limit;i++)
  {
    l2(a);
  }
  TIME(clk) // 4.32 s
}

int main()
{
  int a = 5;
  f(a);
  return 0;
}

为什么更快地调用lambda函数?

使用gcc 4.8和O3

2 个答案:

答案 0 :(得分:8)

Lambda循环反汇编:(在C ++ 11模式下使用godbolt gcc 4.8.2 -O3)

movq    limit(%rip), %rax
testq   %rax, %rax
jle .L7
movl    (%rbx), %eax
movl    $1, %edx
.L8:
movq    limit(%rip), %rcx
movq    %rdx, %rsi
leal    (%rax,%rdx), %edi
addq    $1, %rdx
cmpq    %rcx, %rsi
jl  .L8
movl    %edi, (%rbx)

函数调用循环反汇编:

movq    limit(%rip), %rax
testq   %rax, %rax
jle .L5
movl    (%rbx), %eax
movl    $1, %edx
.L10:
movq    limit(%rip), %rcx
movq    %rdx, %rsi
leal    (%rax,%rdx), %edi
addq    $1, %rdx
cmpq    %rcx, %rsi
jl  .L10
movl    %edi, (%rbx)

这两个循环编译成相同的代码。

任何差异都是由于您执行操作的顺序或随机机会。

通常,lambdas更容易内联,因为()的操作是由变量的类型定义的,而不是值。传播值并使用它们进行优化比使用类型进行优化要困难得多。

经典示例使用qsort vs std::sort

答案 1 :(得分:1)

从概念上讲,该函数可以处理其他变量,但lambda仅适用于a 显然,你拥有的灵活性越多,你就可以支付得越多,就像在这种情况下一样 在这里,发生的事情是在每次调用时将参数传递给函数比不这样做更昂贵,并且编译器无法对此进行优化,因此存在差异。