原始笔记是几条手写式提示加几张截图、一个测试程序,整体偏潦草。这里按”捕获方式 / 内存对比 / 复现程序 / 原始字符串”四块整理,截图和代码保持原样。
当前保留内容
1. lambda 捕获方式
[=]:捕获作用域内全部变量(按值)。[a = a_]:只捕获单个变量(按值,可重命名)。- 部分成员变量需要在 lambda 内修改时,需要使用
&捕获,而不是=。
2. 内存对比(Windows 下的快照测试)
在 Windows 上对内存做快照:分别在 thread 创建前、lambda 表达式内、return 0 三个时间点拍照,观察内存使用情况。
结论是:只捕获单个变量的 lambda,比捕获全部变量的 lambda 内存使用反而更多(对应下面截图)。
[=] 捕获
[mmp=mp] 捕获
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下的差异
FEATURED TAGS
Git
Cheat Sheet
Markdown
Tools
C++
Linker
Thread
Linux
TCP
Network
GDB
Debug
leetcode
链表
WSL
Ubuntu
Windows
Linux Kernel
GCC
Android
adb
Troubleshooting
Profiling
Sanitizer
glibc
MySQL
Database
Python
curl
Build
ELF
clang-format
CMake
Graphviz
Performance
vcpkg
Protobuf
排查
速查
内存
STL
调试
性能分析
性能
读书笔记
方法论
架构
网络
Timer
mbedTLS
TLS
安全
负载均衡
脚本
工具
LRU
二叉树
BST
中序遍历
回溯
二分查找
优先队列
排序
旋转数组
jenkins
部署