Реализация лямбда-выражения C++11 и модель памятиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Реализация лямбда-выражения C++11 и модель памяти

Сообщение Anonymous »

Мне хотелось бы получить некоторую информацию о том, как правильно относиться к замыканиям C++11 и std::function с точки зрения их реализации и управления памятью.
Хотя я не верю в преждевременную оптимизацию, у меня есть привычка тщательно учитывать влияние моего выбора на производительность при написании нового кода. Я также довольно много занимаюсь программированием в реальном времени, например. на микроконтроллерах и в аудиосистемах, где следует избегать недетерминированных пауз выделения/освобождения памяти.

Поэтому я хотел бы лучше понять, когда использовать или не использовать лямбды 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»