2015-10-30 2 views
6

Есть ли накладные расходы при использовании режима захвата по умолчанию?Заблокировать по умолчанию захват по умолчанию

Чтобы уточнить, есть ли какие-либо затраты при использовании первого, связанного с захватом бара, даже если он не используется?

+4

Когда вы говорите «стоимость», что вы подразумеваете под этим? Место хранения? Время исполнения? Время компиляции? Что-то другое? –

+0

@JoachimPileborg Я имею в виду, если в первом случае есть какая-то временная стоимость, например, больше памяти. –

+3

Нет никакой платы. Только первые переменные, которые вы на самом деле используете *, записываются в первом случае. – jalf

ответ

3

не определено, как лямбда-сделки с лицами, захваченных в качестве ссылки, из проекта раздела C++ стандарт 14 (N4140) 5.1.2 [expr.prim.lambda]:

Субъект является зафиксировано ссылкой, если оно неявно или явно захвачено, но не захвачено копией. Не определено, объявлены ли дополнительные неназванные нестатические члены данных в типе замыкания для объектов, захваченных ссылкой. Член анонимного союза не может быть захвачена ссылкой

Эта формулировка была намеренно оставлен открытым, чтобы позволить реализации оптимизировать вокруг этого, см defect report 750: Implementation constraints on reference-only closure objects, который ссылается N2927, который говорит:

Новая редакция больше не указывает какие-либо элементы перезаписи или закрытия для «по ссылке». Использование объектов, захваченных «по ссылке» , влияет на исходные объекты, а механизм для достижения этого - , полностью оставленный для реализации.

2

N3337 5.1.2/15 или N4527 (C++ 14 Окончательный проект) 5.1.2/16

Субъект захватывается по ссылке, если он явно или неявно захвачена, но не охваченными копии , Не определено, являются ли дополнительными неназванными нестатическими элементами данных объявлены в типе замыкания для объектов, захваченных ссылкой.

+1

Замечание 'N3337' - это проект, ближайший к C++ 11, в то время как' N4140' - это проект, ближайший к C++ 14, с которым OP помечен вопрос. Из моего ответа видно, что цитата «N4140» отличается, хотя разница не влияет на этот вопрос. Есть много случаев, когда ответ отличается для C++ 11 и C++ 14. В то время как 'N4527' будет последним рабочим проектом, доступным в настоящее время, это в основном C++ 1z. –

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