More Effective C++: 04效率】的更多相关文章

16:牢记80-20准则 80-20准则说的是大约20%的代码使用了80%的程序资源:大约20%的代码耗用了大约80%的运行时间:大约20%的代码使用了80%的内存:大约20%的代码执行80%的磁盘访问:80%的维护投入于大约20%的代码上.当提到80-20准则时,不要在具体数字上纠缠不清,一些人喜欢更严格的90-10准则.不管准确的数字是多少,基本的观点是一样的:软件整体的性能取决于代码组成中的一小部分. 80-20准则意味着如果你的软件出现了性能问题,你必须能找到导致问题的那一小块代码的位置…
阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象.看了看侯老师的内存管理视频1~3.有点深. 了解一下. 目录 1 内存管理 1.1 C++内存管理详解 1.1.1 内存分配方式 1.1.2 控制C++的内存分配 1.1.3 常见的内存错误及其对策 1.1.4 指针与数组的对比 1.1.5 指针参数是如何传递内存的? 1.1.6 杜绝"野指针" 1.1.7 有了malloc/free为什么还要new/delete? 1.1.8 内存耗尽怎么办? 1.…
阅读effective c++ 04 (31页) 提到的singleton设计模式.了解一下. 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. 应用场景: 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.其他还有如系统的日志输出.MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC…
阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下.    目录 stack与heap 1.Stack 2.Heap 或謂 system heap 3.例子 1.构造函数型 (stack) 2.new型 (heap 動態分配) 4.构造函数型 (stack) 1.stack objects 的生命期 2.static local objects 的生命期 3.global obj…
18:让接口容易被正确使用,不易被误用 1:理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译:如果代码通过了编译,它的作为就该是客户所想要的. 2:许多客户端的错误可以因为导入新类型而得到预防.比如下面的接口: class Date { public: Date(int month, int day, int year); ... }; 这个接口很容易使客户犯错,比如: Date d(, , ); // Oops! Should be "3, 30" ,…
A class can be made noninstantiable by including a private constructor. // Noninstantiable utility class public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass() { throw new AssertionError(); } ... //…
Hi guys, I am happy to tell you that I am moving to the open source world. And Java is the 1st language I have chosen for this migration. It's a nice chance to read some great books like "Effective Java 2nd Edition" and share the note for what I…
PS: 本文只是总结,具体内容需要去查看More Effective C++--效率部分. 1. 80—20准则 大约 20%的代码使用了 80%的程序资源:大约 20%的代码耗用了大约 80%的运行时间:大约 20%的代码使用了 80%的内存:大约 20%的代码执行 80%的磁盘访问:80%的维护投入于大约 20%的代码上:通过无数台机器.操作系统和应用程序上的实验这条准则已经被再三地验证过. 进行优化.寻找瓶颈时,可以用 profiler 程序识别出令人讨厌的程序的 20%部分.不是所有的工…
裸指针有着诸多缺点:裸指针的声明中看不出它指向的是单个对象还是数组:裸指针的声明中也无法看出使用完它指向的对象后是否需要删除,也就是声明中看不出裸指针是否拥有其指向的对象:即使知道要析构裸指针指向的对象,也不可能知道如何析构才是恰当的:即使确知要使用delete来析构,也无法判定到底使用delete还是delete[]:使用裸指针也无法保证在程序多个代码路径上仅执行一次析构,不执行析构会造成内存泄漏,多次析构又会产生未定义行为:无法判断出裸指针是否是空悬指针. 智能指针的提出,就是用来解决裸指针…
条款18:让接口easy被正确使用,不易被误用 1,好的接口非常easy被正确使用,不easy被误用.你应该在你的全部接口中努力达成这些性质. 2,"促进正使用"的办法包含接口的一致性,以及与内置类型的行为兼容. 3,"阻止误用"的办法包含建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这能够防范DLL问题,能够用来自己主动解除相互排斥锁. 条款19:设计class宛如设计type 博客地址:http…
一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. class A { public: A(const string &str) { m_str = str; //m_str 的初始化是在进入构造函数中用户自定义编写代码前完成的,所以这里的m_str = str,执行的不是初始化,而是赋值 } private: string m_str; }; 在数据成员的默认初始化,然后…
对于内置类型以外的初始化责任落在构造函数身上.如下: class PhoneNumber{}; class ABEntry{ public: ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones ); private: string theName; string theAddress; list<PhoneNumber> thePhones;…
对于这个问题自己是比较清楚的,在分支比较多时,switch-case的效率肯定比if-else的要高许多,其原理类似于我们在优化某些程序时使用查表来代替算法计算一样. 如果想进一步深究的话,可以查看GCC编译之后的汇编代码. 这里有两篇Blog可以参考一下,致谢两位作者. 1. switch与ifelse的效率问题 https://blog.csdn.net/kehui123/article/details/5298337 2. if else和switch的效率 https://blog.cs…
Effective Go  高效的go语言 Introduction 介绍 Examples 例子 Formatting 格式 Commentary 评论 Names 名字 Package names 包名 Getters Interface names 接口名 MixedCaps Semicolons 分号 Control structures 控制结构/循环结构 If Redeclaration and reassignment For Switch Type switch Function…
规则一 永远在使用对象之前将它初始化 int x = 0; const char* text = "A C-style string"; double d; std:: cin >> d; // 对于内置类型的初始化必须手工完成,其他类型的初始化职责落在构造函数身上. 规则二 确保每一个构造函数都将对象的每一个成员初始化 这个规则很简单,重要的是不要混淆赋值和初始化操作. class PhoneNumber { ... }; class ABEntry { public:…
读取未初始化的值会导致不明确的行为.在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行.更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序行为,以及许多令人不愉快的调试过程. 对于内置类型的对象手动初始化 对于内置类型以外的任何其他东西,初始化责任落在构造函数身上. 但要区别赋值和初始化.对象的成员变量的初始化动作发生在进入构造函数本体之前. 在上述代码中,theName,theAddress和thephones都不是被初始化,而是被…
为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象.…
“类族”(class cluster)是一种很有用的模式(pattern),可以隐藏“抽象基类”(abstract base class)背后的实现细节.Objective-C的系统框架中普遍使用此模式. 创建类族 现在举例来演示如何创建类族.假设有一个处理雇员的类,每个雇员都有“名字”和“薪水”这两个属性,管理者可以命令其执行日常工作.但是,各种雇员的工作内容却不同.经理在带领雇员做项目时,无须关心每个人如何完成其工作,仅需指示其开工即可. 首先要定义抽象基类: typedef NS_ENUM…
工具类(utility class)不希望被实例化,比如只包含静态方法和静态域的类.为了这个目的,需要让这个类包含一个私有构造器. // 私有构造器示例 public class UtilityClass { // 为该类不能被实例化.子类化添上注释 private UtilityClass() { // 避免不小心在类的内部调用构造器 throw new AssertionError(); } } 其他不可行方法和理由: 1. 将类写成抽象类:可被子类化,甚至误导用户子去继承这个类. 2. 不…
永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. 构造函数成员初始化列表: 这里有一个规则:总是在初始化列表中列出所有成员变量,即使有的成员变量是内置类型(内置类型的初始化和赋值成本相同). 成员初始化顺序 base classes 早于 derived classes 被初始化,class 的成员变量总是以其声明次序被初始化 一个编译单元内定义的…
我看的书是<Effective C#中文版——改善C#程序的50种方法>,Bill Wagner著,李建忠译.书比较老了,04年写的,主要针对C#1.0,但我相信其中的观点现在仍有价值.(平心而论,和Effective C++有差距,毕竟该书成书时对C#的研究不过几年.) 下面是对这本书条款内容的一些归纳和个人理解,由于我比较熟悉C++,因此也会有也一些C++的对比. 第一章 C#语言元素 条款1:使用属性代替可访问的数据成员 1. 属性具有数据成员的访问语法,这是最易于使用的语法. 2. 属…
来源:http://www.cnblogs.com/feisky/archive/2009/11/04/1595990.html 最近又重新看了Effective C+,不过到现在还是有好多地方不懂的,先记下笔记,待用的时候再细细琢磨. 条款1:尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分. 用 const的好处是,调试时,可以直接获取变量,而非定义的数字,这个在使用gdb跟踪代码的时候很…
在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------------------------------------------------------- ⅰ. 手工初始化内置类型对象 ⅱ. 构造函数最好使用成员初值列,而不要在构造函数内使用赋值操作,其排列次序应和他们在类中声明的次序相同 ⅲ. 用local static对象替换non-local st…
记得前段时间又一次拿起<Effective C++>的时候,有种豁然开朗的感觉,所以翻出了我第一遍读时做的笔记.只做参考以及查阅之用.如有需要请参阅<Effective C++>书本. by shenzi/2010.5.17 一.让自己习惯C++    条款01:视C++为一个语言联邦    为了更好的理解C++,我们将C++分解为四个主要次语言: C.说到底C++仍是以C为基础.区块,语句,预处理器,内置数据类型,数组,指针统统来自C. Object-Oreinted C++.这…
最近刚看完Effective C++,记录一下当前几个比较常用的方法. 1.以独立语句将newed对象置入智能指针 智能指针是以对象管理资源,在构造函数中获得资源并在析构函数中释放资源​ 以下调用:​ processWidget(std::tr1::shared_ptr<Widget>(new Widget),priority());​ 创建该调用的代码,编译器要做以下三件事:​ (1)调用priority​ (2)执行“new Widget”​ (3)调用tr1::shared_ptr构造函…
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第4章 设计与声明(1)-读书笔记 <Eff…
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会帮助你更好的理解,其由c.object-oriented c++.template c++和stl四部分组成. 条款02:尽量以const,enum,inline替换#defines 一.要点 ■ 对于单纯变量,最好以const对象或enums替换#defines. ■ 对于形似函数的宏,最好改用i…
Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的"请记住". 让自己习惯C++ 条款01:视C++为一个语言联邦 ① C ② Object-Oriented C++ ③ Template C++ ④ STL 条款02:尽量以const,enum,inline替换#define ① 对于单纯常量,最好以const对象或enums替换#define ② 对于形似函数的宏,最好改用inline函数替换#define 条款03:尽可能使…
1.让自己习惯C++ 条款01:视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 条款02:尽量以const.enum.inline替换 #define 对于单纯常量,最好以const对象或enum替换#define 对于形似函数的宏,最好改用inline函数替换#define 条款03:尽可能使用const 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施b…
微小目标检测的FPN有效融合因子 摘要:基于FPN的检测器在一般物体检测方面取得了显著的进步,例如MS COCO和PASCAL VOC.然而,这些检测器在某些应用场景中会失败,例如微小物体检测.在本文中,我们认为FPN相邻层之间的自上而下的连接对微小物体的检测带来了双重影响,不仅是正面的.我们提出了一个新的概念,融合因子,来控制深层传递给浅层的信息,使FPN适应微小物体的检测.经过一系列的实验和分析,我们探索了如何通过统计方法来估计特定数据集的融合因子的有效值.估计值取决于分布在每个层中的目标数…