Effective Modern C++
文章平均质量分 89
loongknown
凡是过往,皆为序章。
展开
-
Effective Modern C++ 完全解读笔记汇总
Effective Modern C++ 系列学习和解读笔记汇总。原创 2022-10-04 19:27:07 · 7299 阅读 · 1 评论 -
Item 42: Consider emplacement instead of insertion.
介绍容器empalce系列接口的优势和使用场景。原创 2022-10-01 17:56:58 · 2453 阅读 · 0 评论 -
Item 41: Consider pass by value for copyable parameters that are cheap to move and always copied.
介绍C++值传递的价值、应用场景和优势。原创 2022-10-01 16:21:01 · 1995 阅读 · 0 评论 -
Item 40: Use std::atomic for concurrency, volatile for special memory.
Item 40: Use std::atomic for concurrency, volatile for special memory.本 Item 探讨一下 atomic 类型和 volatile 关键字在并发程序中的区别和应用。C++11 提供了 std::atomic 类模版,可以保证操作的原子性,确保其他线程看到的肯定是操作后的结果。类似对操作加锁,而其内部使用特殊指令实现,因而开销较小。考虑下面的应用场景:std::atomic<int> ai(0); // initial原创 2022-09-24 09:03:27 · 1812 阅读 · 0 评论 -
Item 39: Consider void futures for one-shot event communication.
对于两个异步任务,经常需要一个任务(检测线程)告诉另一个任务(反应线程)特定的事件已经发生了,反应线程可以继续执行了。这个事件可能是某个数据结构被初始化了,某一阶段计算完成了,或者一个传感器数据已经采集好了。需要一种机制来完成两个任务线程间的通信,有哪些比较好的方法呢?原创 2022-09-17 22:46:01 · 2066 阅读 · 0 评论 -
Item 38: Be aware of varying thread handle destructor behavior.
那么这个结果就需要被拷贝多次,不是所有结果的类型都是可以拷贝的。其实 callee 的结果是被存储在独立于 caller 和 callee 之外的特殊位置,被成为共享状态(shared state)的位置。直观地观察,被调用者(callee)和调用者(caller)之间有一个通信通道(channel),callee 异步执行完成后,将结果写入(通常通过。再者,callee 的结果也不能存储在 caller 的。方法之前,callee 可能已经结束了,callee 的局部变量。一个 joinable 的。原创 2022-08-20 08:40:45 · 1831 阅读 · 0 评论 -
Item 37: Make std::threads unjoinable on all paths.
每个 只会处于两种状态状态之一:其一为 ,其二为 。一个 的 对应于一个正在或可能在运行的底层线程。例如,一个对应于处于阻塞或者等待调度的底层线程的 是 。对应于底层线程的 已经执行完成也可以被认为是 。而 的线程包括: 的 状态之所以重要的原因之一是:一个 状态的 对象的析构函数的调用会导致正在运行程序停止运行。例如,我们有一个 函数,它接收一个过滤函数 和一个最大值 作为参数。 检查并确定所有条件满足时,对 0 到 执行 。对于这样的场景,一般会选择基于任务的方式来实现,原创 2022-08-06 15:33:59 · 2197 阅读 · 1 评论 -
Item 36: Specify std::launch::async if asynchronicity is essential.
中讨论的标准库的线程管理模块承担了线程的创建和释放的职责,可以有效避免超额订阅、保证负载均衡。要访问本地线程存储(TLS,ThreadLocalStorage)时,无法预测访问的是哪个线程的本地存储。执行一个函数或可调用对象时,你通常期望这个函数是异步执行。综上,如果你的使用场景不是以下几种,则需要考虑是否需要替换。,以上代码就会有问题。,以上代码没有问题。但是,如果执行策略为。是根据执行策略决定是否会异步执行。可能是同步执行也可能是异步执行。是并发执行,也即执行策略为。有两种执行策略,定义在。...原创 2022-07-30 19:41:32 · 2132 阅读 · 0 评论 -
Item 35: Prefer task-based programming to thread-based.
如果你想异步运行一个函数 ,你有两个基本的选择:基于线程的方法(thread-based)和基于任务的方法(task-based)。在比较二者优劣前,我们先介绍下 C++ 软件中线程的3个层次:基于任务的方法一般要优于基于线程的方法。 有返回值,可以代表任务的执行状态。基于线程的方法没有提供一个很好的机制获取返回值。而 返回的 对象提供了 方法可以获取到返回值。并且当 返回异常时,基于线程的方法直接抛出 ,而基于任务的方法可以根据返回值做异常处理。系统的软件线程是有限的,当请求创建的 多于系统提原创 2022-07-10 10:52:33 · 2035 阅读 · 1 评论 -
Item 34: Prefer lambdas to std::bind.
Effective Modern C++ Item 34 的学习和解读。原创 2022-06-05 14:28:17 · 2405 阅读 · 1 评论 -
Item 33: Use decltype on auto&& parameters to std::forward them.
Effective Modern C++ Item 33 的学习和解读。通用 lambda 完美转发的实现。原创 2022-06-03 22:52:36 · 1865 阅读 · 1 评论 -
Item 32: Use init capture to move objects into closures.
Effective Modern C++ Item 3 初始化捕获模式的学习和解读。原创 2022-06-03 13:32:52 · 1683 阅读 · 0 评论 -
Item 31: Avoid default capture modes.
Item 31: Avoid default capture modes.Effective Modern C++ Item 31 的学习和解读。C++11 lambda 表达式有两种默认捕获模式:传引用捕获和传值捕获。默认传引用捕获可能导致引用悬挂的问题。默认传值捕获其实也不能避免这个问题,并且你的 lambda 闭包也不是独立的。先看默认传引用捕获导致引用悬挂的问题。看下面的代码片段:using FilterContainer = std::vector<std::function<原创 2022-05-29 23:45:11 · 2305 阅读 · 0 评论 -
Item 30: Familiarize yourself with perfect forwarding failure cases.
Item 30: Familiarize yourself with perfect forwarding failure cases.花括号初始化(统一初始化、列表初始化)0 或 NULL 作为空指针仅仅声明整型的静态常量(static const)数据成员函数重载和函数模板位域Effective Modern C++ Item 30 的学习和解读。完美转发(perfect forwarding)是 C++11 非常重要的一个特性。转发意味着一个函数将其参数传给另一函数,第二个函数的目的是接收第一个函原创 2022-05-15 23:35:36 · 2083 阅读 · 1 评论 -
Item 29: Assume that move operations are not present, not cheap, and not used.
Item 29: Assume that move operations are not present, not cheap, and not used.Effective Modern C++ Item 29 的学习和解读。在 C++11 新增特性中,移动语义无疑是最重要的一个,它允许编译器使用高效的 move 操作代替低效的 copy 操作。一般地,把你的 C++98 代码使用 C++11 编译器重新编译后,运行的会更快一些。然而,凡是都不是绝对的,本 item 会介绍一些移动语义不可用、不那么原创 2022-05-04 21:53:56 · 2335 阅读 · 0 评论 -
Item 28: Understand reference collapsing.
Item 28: Understand reference collapsing.引用折叠规则万能引用的实例化std::forward 机制生成 auto 变量typedef 类型别名decltype类型推导Effective Modern C++ Item 28 的学习和解读。引用折叠规则所谓引用折叠(reference collapsing)就是当引用指向引用(reference to reference)会折叠(或者坍塌)成一种引用。我们知道,引用分为左值引用和右值引用,因此,引用指向引用就存在原创 2022-04-30 20:45:50 · 2013 阅读 · 0 评论 -
Item 27: Familiarize yourself with alternatives to overloading on universal references.
Item 27: Familiarize yourself with alternatives to overloading on universal references.放弃重载const T& 传递值传递使用 Tag 分发约束接受通用引用的模板权衡Effective Modern C++ Item 27 的学习和解读。在 Item26 中建议大家尽量不要对万能引用进行重载,但同时也确实存在需要对万能引用进行重载的场景。今天就和大家探索下如何满足这种场景的需求,这个 Item 将沿用上个 I原创 2022-04-17 15:25:11 · 2818 阅读 · 1 评论 -
Item 26: Avoid overloading on universal references.
Item 26: Avoid overloading on universal references.Effective Modern C++ Item 26 的学习和解读。这一节给出的建议是尽量不要对万能引用参数的函数进行重载,根因是重载函数的匹配规则。先从一个例子说起:std::multiset<std::string> names; // global data structurevoid logAndAdd(const std::string& name){ au原创 2022-04-05 11:11:57 · 2469 阅读 · 0 评论 -
Item 25: Use std::move on rvalue references, std::forward on universal references.
Item 25: Use std::move on rvalue references, std::forward on universal references.Effective Modern C++ Item 25 的学习和解读。如果函数参数为右值引用,那么这个参数只能绑定到一个右值,你应该充分利用右值的特性(可以移动),使用 std::move 无条件将参数转换为右值。class Widget {public: Widget(Widget&& rhs) //原创 2022-04-04 00:12:20 · 2272 阅读 · 0 评论 -
Item 24: Distinguish universal references from rvalue references.
Item 24: Distinguish universal references from rvalue references.Effective Modern C++ Item 24 的学习和解读。在 C++11 移动语义出现后,遇到 T&& ,你可能认为就是右值引用,其实不然,这可能是一个万能引用(universal reference),右值引用和万能引用只是形式上相似而已,二者实际上是两个概念。右值引用只能绑定到一个右值上;而万能引用既可以绑定到一个右值,也可以绑定到一个左值。原创 2022-03-27 15:25:58 · 2361 阅读 · 0 评论 -
Item 23: Understand std::move and std::forward.
Item 23: Understand std::move and std::forward.Effective Modern C++ Item 23 的学习和解读。std::move 和 std::forward 并不像他们名字所表达的那样,实际上 std::move 并没有移动数据,std::forward 也并没有转发数据,并且它们在运行期什么也没做。先说 std::move,我们看下它在 C++11 中简易的实现:template<typename T> // in nam原创 2022-03-27 00:09:09 · 2690 阅读 · 0 评论 -
Item 22: When using the Pimpl Idiom, define special member functions in the implementation file.
Item 22: When using the Pimpl Idiom, define special member functions in the implementation file.PImpl 技术(编译防火墙)PImpl 技术的智能指针版本Effective Modern C++ Item 22 的学习和解读。这部分介绍一个智能指针的应用场景:编译防火墙。PImpl 技术(编译防火墙)PImpl(Pointer to implementation)是一种 C++ 惯用技术,它是通过将类的原创 2022-03-26 07:34:53 · 2647 阅读 · 1 评论 -
Item 21: Prefer std::make_unique and std::make_shared to direct use of new.
Item 21: Prefer std::make_unique and std::make_shared to direct use of new.make 函数的优点支持 auto避免异常效率更高make 函数的缺陷无法自定义 deleter语义歧义延长对象销毁时间一个 trickstd::make_shared 是 C++11 开始支持的,但是 std::make_unique 是 C++14 才开始支持。如果你的编译器只支持 C++11,你可以实现自己的 make_unique。template原创 2022-03-20 23:31:30 · 2239 阅读 · 0 评论 -
Item 20: Use std::weak_ptr for std::shared_ptr like pointers that can dangle.
Item 20: Use std::weak_ptr for std::shared_ptr like pointers that can dangle.std::weak_ptr 的特点std::weak_ptr 的典型应用循环引用带缓存的工厂方法std::weak_ptr 的特点std::weak_ptr 通常不会单独使用,一般是与 std::shared_ptr 搭配使用,可以将 std::weak_ptr 类型指针视为 std::shared_ptr 指针的一种辅助工具,借用 std::weak原创 2022-03-20 15:04:37 · 2014 阅读 · 0 评论 -
Item 19: Use std::shared_ptr for shared-ownership resource management.
Item 19: Use std::shared_ptr for shared-ownership resource management.引用计数自定义deleter控制块Effective Modern C++ Item 19 的学习和解读。上文中介绍了 std::unique_ptr ,它对指向的资源拥有独占所有权。本文介绍一种新的智能指针:std::shared_ptr,它和其他指向该资源的指针有共享所有权,它可以拷贝和传递,并且通过引用计数来管理资源的生命周期。std::shared_pt原创 2022-03-19 22:28:48 · 2738 阅读 · 0 评论 -
Item 18: Use std::unique_ptr for exclusive-ownership resource management.
Item 18: Use std::unique_ptr for exclusive-ownership resource management.独占所有权占用内存的大小一个典型应用杂项Effective Modern C++ Item 18 的学习和解读。原始指针非常灵活,但是使用陷阱多,容易出错,智能指针则更容易使用。本文介绍的智能指针是 std::unique_ptr。独占所有权std::unique_ptr 表现出独占所有权的语义。一个非空的 std::unique_ptr 总是对它指向的资原创 2022-03-13 21:31:42 · 2820 阅读 · 0 评论 -
Item 17: Understand special member function generation.
Item 17: Understand special member functiongeneration.generation.)Effective Modern C++ Item 17 的学习和解读。在 C++ 中,对于某些特殊成员函数,如果我们没有申明,编译器会自动生成。在 C++98 中,这些特殊成员函数包括默认构造函数、析构函数、拷贝构造函数、拷贝赋值操作。编译器生成这些构造函数的原则是:当你没有申明它们,并且需要使用到它们。编译器生成的这些特殊函数一般是 public 、 inline原创 2022-03-12 07:49:15 · 1921 阅读 · 0 评论 -
Item 16: Make const member functions thread safe.
Item 16: Make const member functions thread safe.const 成员的好处const 成员函数的线程安全问题const 成员函数线程安全保证Effective Modern C++ Item 16 的学习和解读。const 成员的好处一般地,对于不修改成员变量的函数申明为 const 类型,它隐含了是被传入的 this 指针为 const 类型。const 成员函数有两个好处:不会修改成员变量(有特例,下面会介绍),比较安全。可以被 const 和原创 2022-03-06 20:57:31 · 1905 阅读 · 2 评论 -
Item 15: Use constexpr whenever possible.
Item 15: Use constexpr whenever possible.constexpr 对象constexpr 函数Effective Modern C++ Item 15 的学习和解读。constexpr 是 C++11 中令人非常非常困惑的一个新特性。从概念上讲,它不止表明一个对象是 const 的,而且是在编译阶段被知道的。把它用在对象上,可以理解成 const 的加强版。把它用在函数时,将拥有完全不同的涵义。constexpr 对象先从 constexpr 对象开始,这个对象是原创 2022-02-27 23:58:16 · 1854 阅读 · 1 评论 -
Item14: Declare functions noexcept if they won‘t emit exception
本文是对 Effective Modern C++ Item 14 的学习和解读。原创 2022-02-27 16:00:54 · 1839 阅读 · 0 评论 -
Item 13: Prefer const_iterators to iterators.
Effective Modern C++ Item 13 的学习和解读。原创 2022-02-20 15:47:43 · 1908 阅读 · 0 评论 -
Item 12: Declare overriding functions override.
Item 12: Declare overriding functions override.原创 2022-02-19 12:44:32 · 1679 阅读 · 0 评论 -
Item 11: Prefer deleted functions to private undefined ones.
Item 11: Prefer deleted functions to private undefined ones.C++98 的做法C++11 的做法delete 函数优势Effective Modern C++ Item 11 的学习和解读。如果你的代码里有一些特殊的函数不想被别人调用,一般来说你不申明它即可。但是,有些特殊的成员函数,C++ 会自动申明,比如拷贝构造函数、拷贝赋值操作。C++98 的做法C++98 的做法是将它们申明为私有并且不定义它们。以 IO 流为例,IO 流的基础类是原创 2022-02-19 08:44:48 · 3074 阅读 · 0 评论 -
Item 10: Prefer scoped enums to unscoped enums.
[Effective Modern C++ ] Item 10 的学习和解读。原创 2022-02-13 22:43:32 · 1661 阅读 · 0 评论 -
Item 8: Prefer nullptr to 0 and NULL.
Item 8: Prefer nullptr to 0 and NULL.这次是对 Effective Modern C++ Item 8 的学习笔记。在 C++ 中,字面值 0 是一个 int 类型,不是一个指针类型,虽然 C++ 根据上下文可以将字面值 0 解释成一个空指针,但本质上,请注意字面值 0 是一个 int 类型。实际上,NULL 的情况也一样,它也不是一个指针类型,根据实现情况来定,可以被允许实现为 long 类型,但本质上也不是一个指针类型。字面值 0 和 NULL 不是指针类型这原创 2022-02-12 08:10:38 · 1607 阅读 · 0 评论 -
Item 9: Prefer alias declarations to typedefs.
Item 9: Prefer alias declarations to typedefs.背景这次是对 Effective Modern C++ Item 9 的学习笔记。C++98 提供了给类型重新命名的功能:背景typedefstd::unique_ptr<std::unordered_map<std::string, std::string>>UPtrMapSS;这在 C++11 依然能够工作, 但 C++11 提供了新的方式:别名申明(alias decla原创 2022-02-12 08:43:47 · 1606 阅读 · 0 评论 -
Item 7: Distinguish between () and {} when creating objects.
这次是对 Effective Modern C++ Item 7 的学习笔记。原创 2022-02-07 22:01:43 · 1833 阅读 · 0 评论 -
Item 6: Use the explicitly typed initializer idiom when auto deduces undesired types.
这次是对 Effective Modern C++ Item 6 的学习笔记。原创 2022-02-06 21:57:37 · 1706 阅读 · 1 评论 -
Item 5: Prefer auto to explicit type declarations.
这次是对 Effective Modern C++ Item 5 的学习笔记。原创 2022-02-04 22:12:44 · 2091 阅读 · 1 评论 -
Item 4: Know how to view deduced types.
这次是对 Effective Modern C++ Item 4 的学习笔记。原创 2022-02-03 13:42:42 · 1871 阅读 · 0 评论