嵌套的lambda表达式编译速度非常慢,并且通过Visual C++生成大型目标文件

EFa*_*nZh 7 c++ lambda visual-c++ compiler-bug c++11

我发现嵌套的lambda表达式编译和生成巨大的.obj文件非常慢.例如,在我的计算机上,以下代码生成一个大小为4766 KB的obj文件:

int main()
{
  auto f = []
  {
    auto f = []
    {
      auto f = []
      {
        auto f = []
        {
          auto f = []
          {
          };
        };
      };
    };
  };
}
Run Code Online (Sandbox Code Playgroud)

并且以下代码(添加一个嵌套级别)将导致C1128错误.

int main()
{
  auto f = []
  {
    auto f = []
    {
      auto f = []
      {
        auto f = []
        {
          auto f = []
          {
            auto f = []
            {
            };
          };
        };
      };
    };
  };
}
Run Code Online (Sandbox Code Playgroud)

而且,它们的编译速度很慢.这有什么解释吗?我正在使用Visual C++ 2013.

更新

这似乎是Visual C++中的一个错误,我已向Microsoft报告:https://connect.microsoft.com/VisualStudio/feedback/details/813755/nested-lambdas-in-visual-c-2013-are-非常慢的编译和生成巨大的对象文件.

Sha*_*our 2

不确定这种深度嵌套的 lambda 有多有用,但据我所知,这是一个错误,Visual Studio 编译器限制了文档状态(重点是我的):

C++ 标准建议对各种语言结构进行限制。以下是 Visual C++ 编译器未实现建议限制的构造列表。第一个数字是建议的限制,第二个数字是 Visual C++ 实现的限制

并包括以下项目符号:

复合语句的嵌套级别、迭代控制结构和选择控制结构[256] (256)

如果我们查看C++ 草案标准 复合语句中的语法,最终将回到包含lambda-expression的primary-expression。因此 Visual Studio 应该支持最高级别的嵌套。256

您还可以通过查看lambda 表达式的语法来了解这一点, 如下所示:

lambda 引入器 lambda 声明器opt 复合语句

标准草案在附录 B中提出了一组建议限值,但它们只是指导方针,并不确定是否符合要求

更新

OP 提交的错误报告最近已更新,表明该问题将在未来版本中修复。