7

我发现嵌套的 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-编译和生成巨大对象文件的速度非常慢

4

2 回答 2

2

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

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

并包括以下项目符号:

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

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

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

lambda-introducer lambda-declarator opt 复合语句

标准草案在附录 B中有一组建议限制,但它们只是指导方针,并不能确定合规性

更新

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

于 2014-01-14T15:17:59.377 回答
0

编译你的第二个例子给出:

$ 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

我没有看到任何问题。

于 2014-01-14T15:44:57.703 回答