2015-12-01 2 views
1

Рассмотрим следующий код:Лямбда-конструкция и статическая лямбда?

// Classic version 
template <class It> 
It f(It first, It last) 
{ 
    using value_type = It::value_type; 
    auto lambda = [](value_type x){return x > 10 && x < 100;}; 
    return std::find_if(first, last, lambda); 
} 

// Static version 
template <class It> 
It f(It first, It last) 
{ 
    using value_type = It::value_type; 
    static auto lambda = [](value_type x){return x > 10 && x < 100;}; 
    return std::find_if(first, last, lambda); 
} 

Есть ли разница в производительности между этими двумя? Каково время строительства лямбда-функции? Является ли статическая версия лучше с точки зрения производительности, потому что лямбда построена только один раз?

ответ

5

Построение без ёмкости лямбда похоже на создание пустого struct. Современный компилятор должен быть в состоянии полностью оптимизировать это.

В качестве примера смотрите вывод сборки для этой простой программы:

int main(int argc, const char* argv[]) 
{ 
    auto l = [](int i){ return i*i; }; 
    return l(argc); 
} 

Assembly (GCC 5.2.0, начиная с -O1, LIVE):

main: 
    movl %edi, %eax 
    imull %edi, %eax 
    ret 

Как вы можете видеть, нет остатков каких-либо лямбдов и т. д. Он был полностью вложен.

Хотя вашему конкретному случаю использования может потребоваться больше анализа, вероятно, не будет заметной разницы между статическими и нестационарными лямбдами.

Смежные вопросы