C++进阶
文章平均质量分 62
《More Effective C++》学习记录
Zoeygotit
今天加加油 明天技术流
展开
-
【C++ Miscellany】C++重要的几项改变、标准程序库
标准程序库的特点1. 标准程序库中每一样东西几乎都是template;2. 所有成分都位于namespace std内。原创 2023-10-13 09:57:49 · 112 阅读 · 1 评论 -
【C++ Miscellany】如何在同一个程序中结合C++和C
请记住以下几个简单守则:绝对不要重整以其他语言撰写的函数的名称——不论是C,assembler,FORTRAN,Lisp,Forth,COBOL,还是其他任何语言;要压抑name mangling,必须使用C++的指令:extern “C”可以施行于一整组函数身上,只要以花括号封住头尾范围即可:加入__cplusplus,这个符号只针对C++才有定义,即用于C++时含有;用于C时无:原创 2023-10-12 23:12:00 · 147 阅读 · 0 评论 -
【C++ Miscellany】继承体系非尾端类设计为抽象类
你发现自己需要产生一个具体类,继承自程序库的一个具体类,而你只能使用该程序库,不能修改,怎么办?将你的具体类派生自既有的(程序库中的)具体类,但需要注意本条款一开始所验证的赋值相关问题等;试着在程序库集成体系中找到更高的抽象类,其中有你需要的大部分功能,继承它;以“你所希望继承的那个程序库类”来实现你的新类;手上有什么就用什么。继承体系中的non-leaf(非尾端)类应该是抽象类。原创 2023-10-12 22:31:07 · 302 阅读 · 0 评论 -
【C++ Miscellany】未来式思维
未来式思维只不过是加上一些额外的考虑:提供完整的classes——即使某些部分目前用不到。当新的需求进来,你不太需要去回头修改那些classes;设计你的接口,使有利共同的操作行为,阻止共同的错误;让这些classes轻易地被正确运用,难以被错误运用;尽量使你的代码一般化(泛化),除非有不良的巨大后果。原创 2023-10-11 18:41:04 · 68 阅读 · 0 评论 -
【C++ techniques】让函数根据一个以上的对象类型来决定如何虚化
碰撞无法同时依据object1和object2两者的动态类型决定;你需要的是某种函数,其行为视一个以上的对象的动态类型决定,C++并未提供这样的函数,并不直接支持“double dispatching”/“multiple dispatch”。原创 2023-10-10 23:41:17 · 115 阅读 · 1 评论 -
【C++ techniques】利用Proxy classes(代理类)实现:多维数组、区分左/右值运用、限制隐式类型转换
Proxy类的优点:多维数组、左值/右值的区分、压抑隐式转换就是其三。Proxy类的缺点:如果扮演函数返回值的角色,那些proxy对象将是一种临时对象,需要被产生和销毁,构造和析构带来的成本远大于proxies带来的好处,且软件复杂度和也随之增加。原创 2023-10-09 21:05:49 · 320 阅读 · 0 评论 -
【C++ techniques】Reference counting(引用计数)
什么时候最适合reference counting技术:相对多数的对象共享相对少了的实值;对象实值的产生或销毁成本很高,或使它们使用许多内存。原创 2023-10-08 23:17:36 · 234 阅读 · 1 评论 -
【C++ techniques】Smart Pointers智能指针
智能指针看起来、用起来、感觉起来像内置指针,但提供更多的机能。某些智能指针的用途受到诸如“nullness测试、内置指针的转换、以继承为本的转换、对pointers-to-consts的支持“等等限制。尽管如此,智能指针能为你完成一些原本极端困难达成的效果,应该被明智而谨慎地运用。原创 2023-10-07 22:53:09 · 200 阅读 · 1 评论 -
【C++ techniques】要求/禁止/判断—对象产生于堆中
有时候我们想让某种对象具有“自杀”的能力,所以我们必须要求对象存在堆中,以便我们调用delete this; 另一些时候,我们要求拥有某种确定性,保证某一些类型绝不会发生内存泄漏,原因是没有任何一个该类型的对象从堆中分配出来;堆空间非常宝贵,所以我们要对象全为栈对象,必须禁止对象产生于堆中。原创 2023-10-06 22:32:01 · 208 阅读 · 1 评论 -
【C++ techniques】限制某个class所能产生的对象数量
允许零个或一个对象;不同的对象构造状态;允许对象生生灭灭;一个用来计算对象个数的Base Class。原创 2023-10-05 21:09:53 · 133 阅读 · 2 评论 -
【C++ techniques】虚化构造函数、虚化非成员函数
virtual constructor:视其获得的输入,可产生不同的类型对象。原创 2023-10-04 22:39:41 · 368 阅读 · 0 评论 -
【C++ Efficiency】理解虚函数、多重继承、虚基类和RTTI
理解虚函数、多重继承、虚基类及RTTI的成本很重要。但你必须知道:如果你需要这些功能,就要忍受这些成本,世事难两全。有时你确实想要回避编译器生成的服务,例如隐式vptr和“指向虚基类”的指针会造成“将C++对象存储于数据库”和“跨进程移动C++对象”困难度提高,所以你希望有某种方法模拟这些性质。不过从效率上来讲,自己写的不可能比编译器生成的更好。原创 2023-09-28 23:58:31 · 425 阅读 · 1 评论 -
【C++ Efficiency】考虑替换其他程序库来消除程序瓶颈
不同的程序库即使提供相似的机能,也往往表现出不同的性能,所以一旦找到程序的瓶颈,应该知道是否可以通过替换程序库来消除瓶颈。比如:如果你的程序的有I/O瓶颈,你考虑用stdio替换iostream,如果程序的在动态分配和释放上存在使用大量的时间,你可以想想是否有其他的operator new和operator delete的实现可用。因为不同的程序库将效率、扩充性、移植性、类型安全性等的不同设计具体化,有时可以找找看是否存在另一个功能相近的程序库而其在效率上有较高的设计权重。原创 2023-09-27 21:48:29 · 138 阅读 · 0 评论 -
【C++ Efficiency】使用运算符的复合形式取代其单独形式,效率更高
operator的复合形式(operator+=)比单独形式(operator+)效率更加高,开发时优先考虑使用复合形式。原创 2023-09-26 22:04:53 · 213 阅读 · 0 评论 -
【C++ Efficiency】通过重载技术来消除类型转换
通过重载技术来消除类型转换,减少临时对象的产生带来的成本。原创 2023-09-25 22:25:27 · 101 阅读 · 0 评论 -
【C++ Efficiency】返还值最优化(return value optimization):利用函数return消除局部临时对象
利用函数的return点消除一个局部临时对象(并可能用函数端调用的某个对象取代),专属名称叫return value optimization(返回值最优化)。原创 2023-09-24 21:08:27 · 79 阅读 · 0 评论 -
【C++ Efficiency】找到可能产生“临时对象”的地方
临时对象很耗成本,尽可能消除它们。学会寻找临时对象的产生更重要:在任何地方只要见到常量引用(reference-to-const)参数,就存在建立临时对象而绑定参数的可能。在任何时候只要见到函数返回对象,就会有一个临时对象被建立(然后被释放)。原创 2023-09-23 21:31:01 · 157 阅读 · 2 评论 -
【C++ Efficiency】over-eager evaluation的两种做法:caching和prefetching
较佳的速度往往导致较大的内存成本。caching会消耗较多的内存,但是可以降低已被缓存的结果重新生成的时间;需要一些空间来放置被预先取出来的东西,但可以降低访问他们所需要的时间。当你必须支持某些运算而其结果并不总是需要时,lazy evaluation可以改善程序效率;当你必须支持某些运算而其结果几乎总是被需要或经常被多次需要时,over-eager可以改善程序效率。原创 2023-09-21 22:23:07 · 188 阅读 · 0 评论 -
【C++ Efficiency】lazy evaluation(缓式评估)的4种用途
上述四种用途展示了lazy evaluation在许多领域的作用:可避免非必要的对象复制,可区别operator[ ]的读取与写入操作,可避免非必要的数据库读取操作,可避免非必要的数值计算动作。但是,只有当“你的软件被要求执行某些计算,而那些计算其实可以避免”的情况下,lazy evaluation才有用处。原创 2023-09-20 23:40:54 · 167 阅读 · 0 评论 -
【C++ Efficiency】程序效率、80-20法则
一个程序80%的资源用于20%的代码身上。原创 2023-09-19 23:02:28 · 160 阅读 · 0 评论 -
【C++ Exceptions】异常处理的成本
exception是C++的一部分,编译器必须支持。即使从未使用任何异常处理机制,也必须付出一些空间放置某些数据结构,付出一些时间随时保持那些数据结构的正确性。原创 2023-09-19 23:02:09 · 177 阅读 · 0 评论 -
【C++ Exceptions】exception specifications的利与弊、非预期异常的预防与处理
exception specifications是一把双刃剑,清晰说明了函数希望抛出怎样的异常,但是一旦违反就面临程序必须立刻中止的危险。编译器仅对exception specifications做局部的检验,很容易在不经意间违反,而且exception specifications还会妨碍更高层的异常处理函数处理未预期的异常,就算较高层已经知道怎么做了还是可能被提前中止,所以,在将exception specifications加入函数之前,需要再三审度它的行为效果及后果。原创 2023-09-19 22:09:07 · 145 阅读 · 1 评论 -
【C++ Exceptions】Catch exceptions by reference!
最佳的捕捉异常方式:catch by reference。(catch子句内增加一个&符号)原创 2023-09-18 21:00:00 · 277 阅读 · 0 评论 -
【C++ Exceptions】了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异
异常对象在传递时总进行复制。当通过传值方式捕获异常时,异常对象被复制了两次;对象作为参数传递给函数泽不一定需要被复制。对象作为异常被抛出与被传递给函数相比,前者类型转换比后者少(只有两种转换)。catch子句在进行异常类型匹配的顺序是它们在源码中出现的顺序,第一个类型匹配成功的catch被执行;当以某对象调用一个虚函数,被选择执行的函数是与对象类型匹配最佳的类里,不论它是不是第一个。原创 2023-09-17 22:19:41 · 100 阅读 · 0 评论 -
【C++ Exceptions】禁止异常exceptions流出destructors之外
两种情况下析构函数会被调用:当对象在正常情况下被销毁,也就是当它离开了它的生存空间(对象所在的作用域)或是被明确的删除;当对象被exception处理机制——也就是exception传播过程中的stack-unwinding(栈展开)机制——销毁。原创 2023-09-15 17:06:38 · 55 阅读 · 0 评论 -
【C++ Exceptions】在constructors内阻止资源泄露
auto_ptr类模板:当指向动态分配的内存的指针本身停止活动(被销毁)时,所指内存被释放掉。原创 2023-09-14 21:11:47 · 52 阅读 · 0 评论 -
【C++ Exceptions】利用destructors避免泄露资源
以一个对象存放“必须自动释放的资源”,并依赖该对象的destrutor来释放资源。原创 2023-09-13 22:41:00 · 53 阅读 · 0 评论 -
【C++ Operators】了解各种不同含义的new和delete
operator new只负责分配内存,new operator取得operator new返回的内存并将其转换为一个对象。原创 2023-09-07 22:44:47 · 38 阅读 · 0 评论 -
【C++ Operators】不要重载&&(逻辑与)、||(逻辑或)和,(逗号)操作符
C++运算符重载是是一种强大的工具,但我们很难有需求用到这一功能,很难超越原有行为特性且很难避免无误,总而言之,尽量避免重载它们。原创 2023-09-06 22:32:42 · 75 阅读 · 2 评论 -
【C++ Operators】区别++和--操作符的前置和后置形式
后置式应以其前置式为基础;后置式必须返回const,从而禁止i++++这种写法,但允许++++i;后置式的函数声明时,参数须加上int,只是为了和前置式区别开。原创 2023-09-08 19:48:33 · 116 阅读 · 1 评论 -
【C++ Operators】隐式类型转换、避免提供“类型转换函数”
大部分时候,"必须明白调用类型转换函数"虽然带来了些许不便,却可以为"不再默默调用那些其实并不打算调用的函数"而获得弥补(这就是为什么标注库中的 string 类型并未含有“从 string object 至 C-style char*”的隐式转换函数的原因,标准库提供了一个显示的 member function c_str() 执行上述转换行为)。原创 2023-09-12 23:07:42 · 124 阅读 · 2 评论 -
【C++ Basics】非必要不提供default constructor
如果 class constructors 可以确保对象所有字段都会被正确初始化,即可以免除为测试行为付出的时间代价、为测试代码付出的空间代价,因为其可执行文件和程序库都变大了。如果无法保证,最好避免 default constructor 出现。原创 2023-09-11 22:38:12 · 45 阅读 · 0 评论 -
【C++ Basics】不要以多态方式处理数组
绝对不要以多态方式处理数组,多态和指针算数不能混用。原创 2023-09-09 23:45:36 · 33 阅读 · 1 评论 -
【C++ Basics】C++转型操作符
为不涉及继承机制的类型执行转型动作,可使用 static_cast;要改变常量性(constness),则必须使用 const_cast。原创 2023-09-10 16:41:48 · 62 阅读 · 2 评论 -
【C++ Basics】 区别pointers和references
reference是一种特殊的pointer。原创 2023-09-05 23:57:15 · 66 阅读 · 0 评论