Вложенные лямбда-выражения очень медленно компилируются и генерируют огромный объектный файл с помощью Visual Stack Overflow

Я считаю, что вложенные лямбда-выражения очень медленно компилируются и генерируют огромные файлы .obj. Например, на моем компьютере следующий код создает файл obj размером 4766 КБ:

int main()
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
};
};
};
};
};
}

А следующий код (добавлен еще один уровень вложенности) вызовет C1128 ошибка.

int main()
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
auto f = []
{
};
};
};
};
};
};
}

Кроме того, они очень медленно компилируются. Есть ли объяснение этому? Я использую Visual C ++ 2013.

Это похоже на ошибку в Visual C ++, я сообщил об этом в Microsoft: https://connect.microsoft.com/VisualStudio/feedback/details/813755/nested-lambdas-in-visual-c-2013-are-very-slow-to-compile-and-generate-huge-object-file.

7

Решение

Не уверен, насколько полезны такие глубоко вложенные лямбды, но для чего он стоит, насколько я могу судить, это ошибка, Компилятор Visual Studio ограничивает документ состояния (акцент мой):

Стандарт C ++ рекомендует ограничения для различных языковых конструкций. Ниже приведен список конструкций, в которых компилятор Visual C ++ не реализует рекомендуемые ограничения. первое число является рекомендуемым пределом, а второе число является пределом, реализованным в Visual C ++:

и включает в себя следующую маркировку:

Уровни вложенности составных операторов, структуры управления итерациями и структуры управления выбором [256] (256).

Если мы посмотрим на грамматику в Проект стандарта C ++ компаунд-заявление в конечном итоге вернется к первичное выражение который включает в себя лямбда-выражение. Таким образом, Visual Studio должна поддерживать до 256 уровни вложенности.

Вы также можете увидеть это, посмотрев на грамматику лямбда-выражение что следующим образом:

лямбда-интродьюсер лямбда-деклараторвыбирать компаунд-заявление

проект стандарта имеет набор рекомендуемых пределов в Приложение Б но они только руководящие принципы и не определяют соответствие.

Обновить

сообщение об ошибке поле OP было недавно обновлено, чтобы указать, что это будет исправлено в следующем выпуске.

2

Другие решения

Компиляция вашего второго примера дает:

$ time cl x.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

x.cpp
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:x.exe
x.obj

real    0m0.764s
user    0m0.000s
sys     0m0.140s

Размер

$ ls -lh x.exe
-rwxrwxrwx 1 lt None 118K 14. Jan 16:33 x.exe

Я не вижу никаких проблем.

0