C ++ лямбда в функции пространства имен? - PullRequest
0 голосов
/ 03 апреля 2020

Я обсуждаю следующие два стиля использования лямбды:

а) объявляем лямбду в пространстве имен в файле .cc.

b) объявлять лямбду в функции.

Я склоняюсь к a), потому что это делает func() менее многословным, и при каждом вызове функции не создается функтор. Существуют ли какие-либо неблагоприятные / отрицательные эффекты, которые могут иметь а)?

Стиль а)

namespace XXX{

auto lambda_in_namespace=...; // this is a cc file, lambda will not export 

void func(){
   // use lambda_in_namespace
}

}

Стиль б)

namespace XXX{

void func(){
   auto scoped_lambda = ...
   // use scoped_lambda 
}

}

1 Ответ

0 голосов
/ 03 апреля 2020

Основной мотивацией для лямбда-функций было использование в вызовах функций там, где ожидались функциональные объекты. Стандартный заголовок <std::algorithm> имеет много таких функций.

В качестве принципа проектирования, (b) в размещенном вами коде лучше, чем (a). Он сохраняет лямбду локально для функции, в которой он используется, и не загрязняет namespace, содержащий func.

На практике, (b) может быть узким местом в производительности, если func вызывается миллионы раз. С современными машинами дня я серьезно сомневаюсь, что вы заметите разницу даже для тысяч вызовов func.

Мое предложение:

  1. Время двух подходов с тысячами вызовов , затем 1 000 000 вызовов.
  2. Если разница в производительности не заметна, придерживайтесь (b).
  3. Если разница в производительности заметна, используйте (a). Однако при таком подходе я бы предложил использовать обычную функцию вместо лямбда-выражения. Обратите внимание, что лямбда состоит из двух частей - объекта и некоторого исполняемого кода. Функция содержит только исполняемый код.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...