C++ 嵌套的lambda表达式在用visualc+编译和生成大型对象文件时非常慢+;

C++ 嵌套的lambda表达式在用visualc+编译和生成大型对象文件时非常慢+;,c++,visual-c++,c++11,lambda,compiler-bug,C++,Visual C++,C++11,Lambda,Compiler Bug,我发现嵌套的lambda表达式在编译和生成巨大的.obj文件时非常慢。例如,在我的计算机上,以下代码生成大小为4766 KB的obj文件: int main() { auto f = [] { auto f = [] { auto f = [] { auto f = [] { auto f = [] { }; }; };

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

int main()
{
  auto f = []
  {
    auto f = []
    {
      auto f = []
      {
        auto f = []
        {
          auto f = []
          {
          };
        };
      };
    };
  };
}
下面的代码(增加了一个嵌套级别)将导致错误

而且,它们的编译速度非常慢。有什么解释吗?我使用Visual C++ 2013。< /P> 更新

这似乎是VisualC++中的一个bug,我已经向微软报告过了:

< p>不知道这种深度嵌套的lambda是多么有用,但就我所知,这是一个bug,状态(强调地雷):

< > C++标准推荐各种语言结构的限制。下面是VisualC++编译器没有实现推荐的限制的构造列表。第一个数字是建议的限制,第二个数字是Visual C++实现的限制。

并包括以下项目符号:

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

如果我们看一下复合语句中的语法,最终会回到包含lambda表达式的主表达式。因此VisualStudio应该支持多达256个嵌套级别

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

lambda介绍人lambda declaratoropt复合语句

附录B中有一组建议限值,但它们只是指南,并不确定合规性

更新


OP文件最近更新,表明这将在未来版本中修复。

编译您的第二个examaple提供:

$ 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

我看不出有任何问题。

第一个似乎运行得比较快,而且
gcc
clang
。第二个代码片段在rextester.VS2013上似乎不起作用,但可能有点不完整:请参见此处:问题是什么?这似乎是VC++2013中的一个bug,请报告它。所以VC++在这方面不是很擅长?C#开发人员倾向于使用1000个lambda表达式在一个操作符中编写整个程序。也许用VC++编写如此糟糕的代码目前是不可能的,这是件好事……它可能依赖于机器,我必须添加更多的嵌套以使其超时,这意味着运行时间超过30秒。对嵌套级别的实验表明,在超时时间之前添加的每个嵌套级别的时间都有明显的增加。@EFanZh我看不出有任何其他方式可以将其视为一个bug,您真的应该将其作为bug报告提交。有几个与lambda相关的bug,但没有一个与此匹配。我已经报告了它:。
$ ls -lh x.exe
-rwxrwxrwx 1 lt None 118K 14. Jan 16:33 x.exe