摘要:
传递参数 在 C++ 中,创建线程时可以向函数传递参数。std::thread 构造函数接受函数指针或可调用对象作为第一个参数,后续参数会传递给该函数(或可调用对象)。 std::thread 的参数传递机制 拷贝(或移动)所有传入的参数; 然后,在新线程启动时,把拷贝(或移动)后的对象当作实参传给 阅读全文
posted @ 2025-07-20 19:26
_Sylvan
阅读(34)
评论(0)
推荐(0)
摘要:
线程的基本操作 每个程序至少有一个线程:主线程(执行 main() 函数)。使用 std::thread 可以创建更多线程,它们与主线程并发运行。 当线程完成任务,其对应的 std::thread 对象必须被妥善处理(如 join() 或 detach()),否则程序会异常终止。 启动线程 启动线程 阅读全文
posted @ 2025-07-20 19:26
_Sylvan
阅读(25)
评论(0)
推荐(0)
摘要:
C++ 多线程初探 什么是并发? 并发是指两个或多个独立活动在同一时间段内交替或同时发生。生活中常见的例子包括:一边走路一边说话、多人各自完成不同任务等。 计算机中的并发 在计算机系统中,并发指的是在同一个系统上同时运行多个任务。传统的单核处理器通过“任务切换”模拟出并发的效果;而现代多核处理器实现 阅读全文
posted @ 2025-07-20 19:25
_Sylvan
阅读(14)
评论(0)
推荐(0)
摘要:
条款41:对于移动成本低且总是被拷贝的可拷贝形参,考虑按值传递 背景 许多函数参数是可拷贝类型(如 std::string),需要将参数拷贝或移动到类成员或容器中。如何高效且简洁地写这类函数是一个常见问题。 传统解决方案有两种: 重载:对左值传引用,右值传右值引用。 通用引用模板:用模板 T&& 接 阅读全文
posted @ 2025-07-20 19:25
_Sylvan
阅读(20)
评论(0)
推荐(0)
摘要:
条款42:考虑使用置入(emplace)代替插入(insert) 背景 假设有一个 std::vector<std::string>,我们想往里面添加字符串。 std::vector<std::string> vs; // std::string 的容器 vs.push_back("xyzzy"); 阅读全文
posted @ 2025-07-20 19:25
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款34:优先使用 Lambda 而非 std::bind std::bind 是 C++98 中 std::bind1st 和 std::bind2nd 的后续版本,2005 年成为非正式标准库一部分。 C++11 引入了 lambda,C++14 中 lambda 功能更加强大。 现在,lamb 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款33:对 auto&& 形参使用 decltype 以 std::forward 它们 C++14 支持泛型 lambda,可以用 auto 作为形参类型,实现模板化的 operator()。 问题 普通写法: auto f = [](auto x) { return func(normaliz 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(23)
评论(0)
推荐(0)
摘要:
条款32:使用初始化捕获来移动对象到闭包中 核心问题 在 C++11 中,lambda 无法将对象移动进闭包,只能: 按值捕获(复制) 按引用捕获(依赖外部生命周期) 这在以下两种情况下非常不便: 捕获的对象是只能移动的(如 std::unique_ptr, std::future) 捕获的对象复制 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(22)
评论(0)
推荐(0)
摘要:
条款31:避免使用默认捕获模式 背景概述 C++11 提供两种默认捕获模式: [&]:按引用捕获所有使用到的局部变量。 [=]:按值捕获所有使用到的局部变量。 虽然简洁,但这两种模式都存在隐含风险,应尽量避免。 按引用默认捕获 [&] 的风险 悬空引用 如果 lambda 捕获了局部变量的引用,而 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(31)
评论(0)
推荐(0)
摘要:
条款30:万能引用的完美转发失败情况 完美转发简介 完美转发的核心是将函数的参数“完美地”转发给另一个函数,保持参数的类型、左值/右值属性、const/volatile属性不变。 万能引用(也称通用引用)使得模板函数能接受左值和右值参数,通过 std::forward<T> 保持实参特性传递。 例如 阅读全文
posted @ 2025-07-20 19:23
_Sylvan
阅读(33)
评论(0)
推荐(0)
摘要:
条款29:认识移动操作的缺点 假定移动操作不存在,成本高,未被使用。 移动语义简介 C++11 引入移动语义,允许用开销低的移动操作替代高成本的复制操作,从而提升性能。编译器会在满足条件时默认生成移动构造函数和移动赋值操作。 但是: 并不是所有类型都支持移动操作。 有些移动操作并不比复制操作快。 移 阅读全文
posted @ 2025-07-20 19:22
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款28:理解引用折叠 万能引用的模板推导原理 template<typename T> void func(T&& param); 当传入左值时,T 会被推导为左值引用类型,如 Widget&。 当传入右值时,T 会被推导为非引用类型,如 Widget。 示例: Widget w; // 左值 W 阅读全文
posted @ 2025-07-20 19:22
_Sylvan
阅读(32)
评论(0)
推荐(0)
摘要:
条款27:熟悉万能引用重载的替代方法 背景示例 std::multiset<std::string> names; template<typename T> void logAndAdd(T&& name) { auto now = std::chrono::system_clock::now(); 阅读全文
posted @ 2025-07-20 19:22
_Sylvan
阅读(17)
评论(0)
推荐(0)
摘要:
条款26:避免在万能引用上重载 背景示例 假设有个函数,需要用名字打印日志并加入全局集合: std::multiset<std::string> names; // const 左值引用既能绑定左值,也能绑定右值(包括临时对象) void logAndAdd(const std::string& n 阅读全文
posted @ 2025-07-20 19:21
_Sylvan
阅读(12)
评论(0)
推荐(0)
摘要:
条款24:区分万能引用与右值引用 核心结论 判断条件 结果 是 T&&,并且发生类型推导 万能引用 是 T&&,但没有类型推导 右值引用 const T&& / vector<T>&& 等非标准形式 右值引用 auto&&,发生类型推导 万能引用 万能引用(Universal Reference) 阅读全文
posted @ 2025-07-20 19:21
_Sylvan
阅读(35)
评论(0)
推荐(0)

浙公网安备 33010602011771号