лямбды, компилятор может это как-то понять и оптимизировать? (может общий тип им присвоить)
std::vector<std::function<void(void)>> A;
for(auto item : items)
A.push_back([item](){});
В данном случае нет, ты же используешь std::function
а в каком случае будет?
У лямбд будет один и тот же тип, но разное содержимое (значение захваченных переменных). Тело лямбды сгенерируется один раз. Но оверхед на std::function никуда не денется
Это в каком компиляторе?
о, это здорово, тогда я могу использовать тип этой лямбды в качестве параметра шаблона, и не бояться что там образуется куча инстансов? (я подумал уйти от std:function через динамический полиморфизм, вот так будет работать быстрее, интересно? https://pastebin.com/KhawCSxj )
std::function будет быстрее, т.к. под капотом там примерно тоже самое, но реализации обычно содержат SBO SOO, чтобы избегать динамических аллокаций.
зачем? у тебя лямбда имеет захват. это удобно. в гцц есть оптимизация малого буфера в std::function. и захват двух указателей не будет вызывать диспетчер памяти и этим пользуются даже в эмбедете где маллока нет вообще
std::function так же и реализован, только лучше
о, это ещё приятнее, если std::function работает быстрее, чем это, тогда на мой неприхотливый взгляд её (его) более чем достаточно
Ты изобрел type erasure, наверное, сам того не подозревая
нет, подозревая
Опечатка. SOO, конечно - small object optimization
Поди ещё EBO имеет место быть
Ну вот функтион так и реализован Переизобретать даже не надо!
Ну это уже делали реализации
то есть если у меня там очень маленькие лямбды и маленький список захвата, я даже могу надеяться что вектор будет лежать одним куском, без ссылок куда либо из его элементов?
Без динамической памяти под каждый элемент, да
👍 это очень приятно
Очень маленький - воспринимать буквально. На GCC8/9 - 16 байт, на MSVC - аж 40, Стандарт обещает от 8
это ценное примечание, спасибо
Обсуждают сегодня