C++ lambda 捕获与原始字符串整理

捕获方式、内存对比、复现程序与 R"(..)" 写法

Posted by BY on April 25, 2026

原始笔记是几条手写式提示加几张截图、一个测试程序,整体偏潦草。这里按”捕获方式 / 内存对比 / 复现程序 / 原始字符串”四块整理,截图和代码保持原样。

当前保留内容

1. lambda 捕获方式

  • [=]:捕获作用域内全部变量(按值)。
  • [a = a_]:只捕获单个变量(按值,可重命名)。
  • 部分成员变量需要在 lambda 内修改时,需要使用 & 捕获,而不是 =

2. 内存对比(Windows 下的快照测试)

在 Windows 上对内存做快照:分别在 thread 创建前、lambda 表达式内、return 0 三个时间点拍照,观察内存使用情况。

结论是:只捕获单个变量的 lambda,比捕获全部变量的 lambda 内存使用反而更多(对应下面截图)。

[=] 捕获

BwOgBBIbrm

[mmp=mp] 捕获

5mSmqms8X9

3. 测试程序

#include<thread>
#include <map>
#include <vector>
#include <iostream>

int main(int argc, const char *argv[]) {

     std::map<int,std::string> mp;
     for(int i = 0; i < 10000; ++i)
     {
     mp.emplace(i,std::to_string(i));
     }

     std::vector<std::string> arr;
     for(int i = 0; i < 10000; ++i)
     {
       arr.emplace_back(std::to_string(i));
     }
      // test1
     std::thread t = std::thread([=](){

     });
     // // test2
     //std::thread t = std::thread([mmp=mp](){

     //});

     if (t.joinable())
     {
       t.join();
     }


     for (int i = 0; i < 100; ++i)
     {
       std::cout << std::endl;
     }
return 0;
}

4. 原始字符串(写 JSON 策略时)

R"(...)" 不需要转义内嵌的双引号,写 JSON 字符串会非常方便:

std::string policy_json = R"((Your JSON policy here))";

后续可补的方向

  • 把”[=] 反而比 [mp=mp] 内存少”的现象说清楚(编译器如何决定按值复制的实际范围、未引用捕获是否被优化掉)
  • 用更小、可单步跟踪的样例对照 -O0 / -O2 下的差异