Разные размеры лямбда-выражений в VS2010? - PullRequest
3 голосов
/ 23 февраля 2011

Из любопытства я проверил размер выражения ламба. Моей первой мыслью было, что они будут размером 4 байт, как указатель на функцию. Как ни странно, результат моего первого теста был 1:

auto my_lambda = [&]() -> void {};
std::cout << sizeof(my_lambda) << std::endl;

Затем я проверил с некоторыми вычислениями внутри лямбды, вывод по-прежнему 1:

auto my_lambda2 = [&]() -> void {int i=5, j=23; std::cout << i*j << std::endl;};
std::cout << sizeof(my_lambda2) << std::endl;

Моя следующая идея была довольно случайной, но результат, в конце концов, изменился, отображая ожидаемое 4:

auto my_lambda3 = [&]() -> void {std::cout << sizeof(my_lambda2) << std::endl;};
std::cout << sizeof(my_lambda3) << std::endl;

По крайней мере, в Visual Studio 2010. В идеале все еще отображается 1 в качестве вывода.
Я знаю о стандартном правиле, что лямбда-выражение не может появиться в неоцененном контексте, но afaik, который учитывает только прямое использование лямбда, как
sizeof([&]() -> void {std::cout << "Forbidden." << std::endl;})
на котором VS2010 подсказывает мне ошибку компилятора. Кто-нибудь понял, что происходит?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Благодаря комментарию @Hans Passant по этому вопросу, решение было найдено.Мой первоначальный подход был неверным в том смысле, что я думал, что каждый объект будет захвачен лямбда-выражением, но это не так, только те, которые входят в объем, включены, и только если они используются.
И для каждого изэти захваченные объекты, используются 4 байта (размер ссылки).

1 голос
/ 23 февраля 2011

Visual Studio, вероятно, не реализует лямбда-объекты как функции.Вы, вероятно, получаете объект обратно.Кто знает, как это выглядит.Если вы действительно заинтересованы, вы всегда можете посмотреть на свои переменные с помощью отладчика и посмотреть, как они выглядят ... если это позволит вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...