Хотя я не верю в преждевременную оптимизацию, у меня есть привычка тщательно учитывать влияние моего выбора на производительность при написании нового кода. Я также довольно много занимаюсь программированием в реальном времени, например. на микроконтроллерах и в аудиосистемах, где следует избегать недетерминированных пауз выделения/освобождения памяти.
Поэтому я хотел бы лучше понять, когда использовать или не использовать лямбды C++.
На данный момент я понимаю, что лямбда без захваченного замыкания в точности похожа на обратный вызов C. Однако когда среда захватывается по значению или по ссылке, в стеке создается анонимный объект. Когда из функции необходимо вернуть замыкание значения, его оборачивают в std::function. Что происходит с памятью замыкания в этом случае? Копируется ли он из стека в кучу? Освобождается ли он всякий раз, когда освобождается std::function, т. е. подсчитывается ли у него количество ссылок, как у std::shared_ptr?
I представьте, что в системе реального времени я мог бы настроить цепочку лямбда-функций, передав B в качестве аргумента продолжения в A, чтобы был создан конвейер обработки A->B. В этом случае замыкания A и B будут выделены один раз. Хотя я не уверен, будут ли они размещены в стеке или в куче. Однако в целом это кажется безопасным для использования в системе реального времени. С другой стороны, если B создает некоторую лямбда-функцию C, которую она возвращает, то память для C будет повторно выделяться и освобождаться, что неприемлемо для использования в реальном времени.
В псевдокоде — цикл DSP, который, я думаю, будет безопасен в реальном времени. Я хочу выполнить блок обработки A, а затем B, где A вызывает свой аргумент. Обе эти функции возвращают объекты std::function, поэтому f будет объектом std::function, среда которого хранится в куче:
Код: Выделить всё
auto f = A(B); // A returns a function which calls B
// Memory for the function returned by A is on the heap?
// Note that A and B may maintain a state
// via mutable value-closure!
for (t=0; t
Подробнее здесь: [url]https://stackoverflow.com/questions/12202656/c11-lambda-implementation-and-memory-model[/url]
Мобильная версия