Effective Modern C++ 读书笔记:智能指针
智能指针是现代 C++ 中的一个重要内容,以至于当使用现代 C++ 编程时,智能指针可以完全取代裸指针。 使用 C 风格裸指针,存在很多已经被人诟病已久的问题,比如: 裸指针从声明中,无法看出它指向的是对象还是数组; 无法通过裸指针本身来判断,是否需要析构它的资源; 就算知道需要析构资源,也不知道应该怎么析构,是直接调用 delete 还是调用某个用于释放资源的函数; 另外,同第1条,也不可能知道应该调用 delete 还是 delete[],这都带来了很多风险; 在使用裸指针的工程中,时刻都需要考虑这些资源在不同路径下的状态,除了常规代码逻辑外,还需要考虑发生异常时的路径。一旦有所疏忽,便会出现资源泄漏或未定义行为; 如果资源释放时,没有将裸指针置为 0,那么将来再次意外解引用时,就会遇到悬挂指针问题; 为了解决这些问题,现代 C++ 提出了几种智能指针,它的本质是依靠 C++ 的 RAII 设计理念,将资源管理和对象生命周期绑定在一起,从而避免让程序员主动去操作资源释放的行为。unique_ptr 和 shared_ptr 是两种最常见的智能指针,另外还有 weak_pt...
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 以上这几种写法,本质上有什么区别?这些初始化语法都做到了相同的目的,但作为一个高级语言,这种混乱多变的用法,事实上并不讨喜。于是 C++ 11 引入了统一初始化语法,或者书中被称为大括号初始化语法。 大括号初始化除了能初始化一个单独的值,还可以直接初始化容器: 1std::vector<int> v{1, 2, 3}; // 初始化 v 中存放 3 个元素:1,2,3 小括号初始化和等号初始化,在一些场合不能使用,但都可以替...
Chapter.316
你的一生,可以是十次生命
Effective Modern C++ 读书笔记:auto
条款 5:优先选用 auto使用 auto 会带来很多好处,比如: 不需要关注一些复杂的类型声明,比如模板函数和 lambda 表达式类型 不会忘记初始化变量(auto 要求必须初始化) 一些不希望发生的隐式类型转换 代码类型变化时,不需要在多处修改类型,auto 自适应 使用 auto 来取代显式指定类型的建议,一个很大的反对声音,就是无法从代码中直观地看出一个变量的类型。针对这种强有力地反对声浪,实际上有多种理由来反驳,比如说: 大多数现代编程语言,基本都支持类型推导的特性 一个好的名字,比一个类型要重要的多。比如我们不需要知道迭代器的类型,但只要从名字中看出这是一个迭代器,就可以 一些现代化的编辑器,都支持显示类型,这包括 vim/emacs 这些有年代感的软件 默认使用 auto,但在一些特殊情况,比如需要明确指定类型时,显式声明类型 有关于 auto 的讨论,网络上有很多,我这里不一一列举。下面看几个书中的例子。 案例 1:使用 auto 替代函数对象以下代码,我们希望使用一个类型来接受 lambda 表达式,通常的做法是使用 auto,让编译器去推导...
Effective Modern C++ 读书笔记:类型推导
前言先开一小节介绍下我写这个的缘由。 很多年前,看过《Effective C++》,是一本好书,把一些 C++ 的细节抽出来深入探索,能学到好多东西。不过,这本书太老了,里边一些内容需要更新,著书时应该 C++14 还没出。前段时间工作有点空,就看了《Effective Modern C++》,可以认为是前者的重构版,引入了一些更新的 C++ 规范,如果你两本书都没看过,那只推荐去看《Effective Modern C++》。 然而,虽然两本书的原作者都是 Scott Meyers,但译者却不是同一个人,《Effective C++》的译者侯捷老师的翻译非常出色,然而,我在阅读《Effective Modern C++》时,却感到晦涩难懂。我不知道是我的理解能力不足,还是译者的中文水平有限,阅读时让我不得不找出英文原文,对照着理解一些中文版云里雾里的内容。 网络上除了官方出版的这个中译版,还有一些积极地团体对该著作重新翻译,所以我大不可能去做重复的事情。以下这个系列文章,只是我阅读笔记的整理。整理笔记可以梳理思路,发现理解的漏洞,并温习知识,甚至,还能发现一些书中的小错误,是大...
Chapter.152
网络上的信息都是良莠不齐的信息
学习LLVM数据结构:SmallSet
在现代 C++ 程序开发中,选择合适的数据结构,对于程序性能和内存安全都至关重要。LLVM 项目中,有一大块内容便是设计用于内部开发的高效数据结构。 本系列文章以 cppreference 的格式,介绍这些实用的数据结构。你既可以将其作为学习参考,也可以作为学习 LLVM 的补充材料。 学习LLVM数据结构:ArrayRef学习LLVM数据结构:SmallVector学习LLVM数据结构:StringRef学习LLVM数据结构:SmallSet 在现代编程语言开发中,集合(Set)是一种非常有用的数据结构,它可以高效存储唯一元素。本文介绍一种更轻量级的集合实现:SmallSet。它非常适合存储少量元素,同时保持出色的性能和内存效率。 基本介绍SmallSet 是一种小型集合类型,它实现了基本的集合操作,比如插入、删除和查找等。它的设计目标是优化在存储小规模数据时的性能和内存占用,它结合了小对象优化和动态内存调节技术,非常适合频繁访问的小集合场景。如果你已经对 SmallVector 有了解,那么 SmallSet 和它有着类似的实现思路。 llvm::SmallSet 定义在...
读书推荐:南京大屠杀
忘记历史的人,就一定会重蹈覆辙,这既是指日本人忘记过去会再次犯错,更是指中国人忘记过去,会让历史重演。张纯如老师一生最伟大的这部作品,最大的价值就在于,让距离那场灾难将近 100 年后的现代人,能再次回顾那段不堪往事,能不忘国耻,能时刻谨记身为这个民族的一员,所应该承担的责任和价值。 这本书相当地克制,换作我,无论如何也做不到保持理性和客观地介绍当时的情况,从日本人的角度、中国人的角度、西方人的角度去展现事实。虽然我已经对南京大屠杀有过了解,也参观过南京大屠杀遇难同胞纪念馆,但读完本书,还是收获很多。 南京是当时中国的首都,在南京发生这种事情,远比当时其他惨剧影响更恶劣。而南京大屠杀只是日本发动侵华战争中,犯下的其中一个罪行,类似的悲剧也在其他城市和乡村发生。书中提到,就仅仅是日本士兵在向南京进发时,途径苏州,在短短几天内,苏州 35 万人口,锐减到不足 500 人。 书中给我留下深刻印象的是拉贝前辈,我曾听说过他是大屠杀发生时的一个异国志士,但没想到帮助他能保护中国人民的重要力量是他的政党,纳粹党。同一时期,纳粹在欧洲大陆上开展种族屠杀,在亚洲大陆上却在进行着一场人道救援,这让...
学习LLVM数据结构:StringRef
在现代 C++ 程序开发中,选择合适的数据结构,对于程序性能和内存安全都至关重要。LLVM 项目中,有一大块内容便是设计用于内部开发的高效数据结构。 本文将以 cppreference 的格式,介绍这些实用的数据结构。你既可以将其作为学习参考,也可以作为学习 LLVM 的补充材料。 学习LLVM数据结构:ArrayRef学习LLVM数据结构:SmallVector学习LLVM数据结构:StringRef学习LLVM数据结构:SmallSet 基本介绍llvm::StringRef 定义在 llvm/ADT/StringRef.h 头文件中。 它的声明为: 1class StringRef; 和 ArrayRef 类似,StringRef 是一种轻量级的字符串引用类型,它用于实现高效地表示和操作字符串数据,尤其是在一些高频处理字符串,但同时不希望维护实际内存开销地场景下。 它是不可变引用,主要用于向函数内传递字符串同时避免深拷贝。它只包含了指向字符串的指针和字符串的长度信息,从而使得对它的操作直接而高效。 特点 轻量级:只存储一个指向字符串的指针和字符串的长度,不存储实际的数...
学习LLVM数据结构:SmallVector
在现代 C++ 程序开发中,选择合适的数据结构,对于程序性能和内存安全都至关重要。LLVM 项目中,有一大块内容便是设计用于内部开发的高效数据结构。 本文将以 cppreference 的格式,介绍这些实用的数据结构。你既可以将其作为学习参考,也可以作为学习 LLVM 的补充材料。 学习LLVM数据结构:ArrayRef学习LLVM数据结构:SmallVector学习LLVM数据结构:StringRef学习LLVM数据结构:SmallSet 基本介绍llvm::SmallVector 定义在 llvm/ADT/SmallVector.h 头文件中。它的声明为: 12template<typename T, unsigned N = CalculateSmallVectorDefaultInlinedElements<T>::value> class SmallVector; llvm::SmallVector 是一个可变长数组,类似于 std::vector,同时它对较小长度的数组做了优化。它的内存管理方式采用局部缓存的设计思路,在对象内部预留一小块...














