Effective Modern C++:右值引用、移动语义和完美转发
在学习 C++ 时,当接触到右值引用和移动语义等概念时,就会劝退很多人。一方面,是因为这些概念本身已经不再是入门知识了,即使不懂,也可以写出一些程序了;另一方面,大多数教材中,并没有以最简洁易懂的方式完成这些知识的传授。 本章节会把这部分知识最底层最细节的内容,用另一个视角展示出来。但前提是,你需要已经理解什么是左值和右值,什么是引用这些基本的概念。 条款 23:理解移动语义和完美转发移动语义当我们写下一条赋值语句时,很多时候,实际上是完成了一次拷贝操作,也就是将数据复制一份,放入新声明的对象内存中。当数据量比较大时,并且赋值之后,原始的数据将不会再使用时,这种复制的代价会很大也很没必要...
Effective Modern C++ 读书笔记:智能指针
智能指针是现代 C++ 中的一个重要内容,以至于当使用现代 C++ 编程时,智能指针可以完全取代裸指针。 使用 C 风格裸指针,存在很多已经被人诟病已久的问题,比如: 裸指针从声明中,无法看出它指向的是对象还是数组; 无法通过裸指针本身来判断,是否需要析构它的资源; 就算知道需要析构资源,也不知道应该怎么析构,是直接调用 delete 还是调用某个用于释放资源的函数; 另外,同第1条,也不可能知道应该调用 delete 还是 delete[],这都带来了很多风险; 在使用裸指针的工程中,时刻都需要考虑这些资源在不同路径下的状态,除了常规代码逻辑外,还需要考虑发生异常时的路径。一旦有所疏...
Effective Modern C++ 读书笔记:转向现代C++
条款 7:在创建对象时区分 () 和 {}这是一个令很多人头痛的问题,如果没有完全搞懂这里边的门道,是不会愿意使用 C++ 提供的大括号初始化语法的。或者,大多数人多少也有踩过坑的过去。 大括号初始化语法的优点讨论以下代码: 1234int x(0); // 使用小括号来初始化 x 值为 0 int y = 0; // 使用等号来初始化 y 值为 0 int z{0}; // 使用大括号来初始化 z 值为 0 int r = {0}; // 使用等号和大括号来初始化 r 值为 0 以上这几种写法,本质上有什么区别?这些初始化语法都做到了相同的...
Chapter.316
你的一生,可以是十次生命
Effective Modern C++ 读书笔记:auto
条款 5:优先选用 auto使用 auto 会带来很多好处,比如: 不需要关注一些复杂的类型声明,比如模板函数和 lambda 表达式类型 不会忘记初始化变量(auto 要求必须初始化) 一些不希望发生的隐式类型转换 代码类型变化时,不需要在多处修改类型,auto 自适应 使用 auto 来取代显式指定类型的建议,一个很大的反对声音,就是无法从代码中直观地看出一个变量的类型。针对这种强有力地反对声浪,实际上有多种理由来反驳,比如说: 大多数现代编程语言,基本都支持类型推导的特性 一个好的名字,比一个类型要重要的多。比如我们不需要知道迭代器的类型,但只要从名字中看出这是一个迭代器,就...
Effective Modern C++ 读书笔记:类型推导
前言先开一小节介绍下我写这个的缘由。 很多年前,看过《Effective C++》,是一本好书,把一些 C++ 的细节抽出来深入探索,能学到好多东西。不过,这本书太老了,里边一些内容需要更新,著书时应该 C++14 还没出。前段时间工作有点空,就看了《Effective Modern C++》,可以认为是前者的重构版,引入了一些更新的 C++ 规范,如果你两本书都没看过,那只推荐去看《Effective Modern C++》。 然而,虽然两本书的原作者都是 Scott Meyers,但译者却不是同一个人,《Effective C++》的译者侯捷老师的翻译非常出色,然而,我在阅读《Eff...
Chapter.152
网络上的信息都是良莠不齐的信息
学习LLVM数据结构:SmallSet
在现代 C++ 程序开发中,选择合适的数据结构,对于程序性能和内存安全都至关重要。LLVM 项目中,有一大块内容便是设计用于内部开发的高效数据结构。 本系列文章以 cppreference 的格式,介绍这些实用的数据结构。你既可以将其作为学习参考,也可以作为学习 LLVM 的补充材料。 学习LLVM数据结构:ArrayRef学习LLVM数据结构:SmallVector学习LLVM数据结构:StringRef学习LLVM数据结构:SmallSet 在现代编程语言开发中,集合(Set)是一种非常有用的数据结构,它可以高效存储唯一元素。本文介绍一种更轻量级的集合实现:SmallSet。它非...
读书推荐:南京大屠杀
忘记历史的人,就一定会重蹈覆辙,这既是指日本人忘记过去会再次犯错,更是指中国人忘记过去,会让历史重演。张纯如老师一生最伟大的这部作品,最大的价值就在于,让距离那场灾难将近 100 年后的现代人,能再次回顾那段不堪往事,能不忘国耻,能时刻谨记身为这个民族的一员,所应该承担的责任和价值。 这本书相当地克制,换作我,无论如何也做不到保持理性和客观地介绍当时的情况,从日本人的角度、中国人的角度、西方人的角度去展现事实。虽然我已经对南京大屠杀有过了解,也参观过南京大屠杀遇难同胞纪念馆,但读完本书,还是收获很多。 南京是当时中国的首都,在南京发生这种事情,远比当时其他惨剧影响更恶劣。而南京大屠杀只是...
学习LLVM数据结构:StringRef
在现代 C++ 程序开发中,选择合适的数据结构,对于程序性能和内存安全都至关重要。LLVM 项目中,有一大块内容便是设计用于内部开发的高效数据结构。 本文将以 cppreference 的格式,介绍这些实用的数据结构。你既可以将其作为学习参考,也可以作为学习 LLVM 的补充材料。 学习LLVM数据结构:ArrayRef学习LLVM数据结构:SmallVector学习LLVM数据结构:StringRef学习LLVM数据结构:SmallSet 基本介绍llvm::StringRef 定义在 llvm/ADT/StringRef.h 头文件中。 它的声明为: 1class StringR...














