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

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

解决方法

不确定这种深度嵌套的lambda是多么有用,但据我所知,这是一个错误,Visual Studio compiler limits document状态(强调我的):

The C++ standard recommends limits for varIoUs language constructs. The following is a list of constructs where the Visual C++ compiler does not implement the recommended limits. The first number is the recommended limit and the second number is the limit implemented by Visual C++:

包括以下项目:

nesting levels of compound statements,iteration control structures,and selection control structures [256] (256).

如果我们看一下C++ draft standard中的语法,复合语句最终会回到包含lambda-expression的primary-expression.所以Visual Studio应该支持多达256级的嵌套.

您还可以通过查看lambda-expression的语法来看到这一点,如下所示:

lambda-introducer lambda-declaratoropt compound-statement

draft standard在附录B中有一套建议限值,但它们只是指导原则,不能确定是否符合要求.

更新

最近更新了OP提交的bug report以表明将在未来的版本中修复.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...