自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 [读书笔记] 重构改善既有代码的设计(5)

继续整理下第七章的内容, 关于对象属性的迁移。1. 迁移函数当某个函数与其不所属类有着更密切的关系时,考虑把该函数移到新类中,在新类中建立一个有着类似行为的函数,移除就函数,或者将旧函数变成一个单纯的委托函数。这样做的目的是减少类间的耦合,保证类更简单。2. 迁移字段跟第一条类似,如果类的某个成员被另一个类更加频繁的使用,则考虑移到另一个类中,注意这里的使用不一定是直接使用,也有可能是通过取值设值函

2017-05-04 22:09:00 504

原创 [读书笔记] 重构改善既有代码的设计(4)

最近比较忙,偷闲整理下第六章的内容,关于重新组织函数的内容。1. 提炼函数比较简单但又很常用的手法,目的是把一段逻辑上紧密联系构成相对独立功能块的代码封装起来,通过函数名字清晰的表达其用途,这样潜在的提供了其他模块复用该函数的概率,同时也更加易于维护,因为原来嵌在一大段逻辑中的代码被抽离出来了,对其修改不必在去关系大范围的影响。实施这个重构手法时要注意涉及的上下文变量,可以通过参数,返回值,甚至是添

2017-04-27 21:47:03 353

原创 [读书笔记] 重构改善既有代码的设计(3)

继续整理本书的内容。第四章:构建测试体系。关于测试体系的几条参考准则: 1. 确保所有的测试都完全自动化,让他们检查自己的测试结果。 2. 一套测试就是一个很强大的bug侦测器,能够大大的缩减查找bug所需的时间。 3. 频繁的运行测试,每次编译请把测试也考虑进去,至少每天执行一遍每一个测试。 4. 每当收到bug报告,请先写一个单元测试来暴露bug。 5. 编写未臻完善的测试并实际运行,

2017-04-04 21:29:36 404

原创 [读书笔记] 重构改善既有代码的设计(2)

整理第三章的内容,关于代码的坏味道,这些往往也是可以进行重构的信号。 1. 重复代码。这个是非常常见的代码结构问题,这样的代码问题也很明显:难以维护,重复代码意味着当一份代码改动时,另一份也必须做出相应的改动,否则就会出现不一致的问题。这种情况应该提取共同代码。 2. 过长函数。函数过长意味着函数很复杂,处理了好多内容,违背单一职责,同时,程序愈长愈时难以理解,也很难为其起一个合适的可以表其意的

2017-02-26 21:41:02 512

原创 [读书笔记] 重构改善既有代码的设计(1)

《重构:改善既有代码的设计》已经读了一大半了,书中讲了很多的重构手段和指导原则,但整体感受下来,重构的一个主要目的就是消除重复,放眼看去,众多的重构手段都是在消除重复代码,提炼函数,提炼父类等等。 之后会针对每一章,整理一下读书笔记,方便之后参阅。第一章:重构,第一个案例着一章主要是起到入门的作用,以一个不是很复杂的例子,一步步演示可以进行哪些重构,也用到了后面章节提到的部分重构手段,但是主要目的

2017-01-16 21:09:04 505

转载 C++11/14新特性快速概览

推荐几篇关于C++11/14新特性的文章,是一个系列的,可以快速了解那些新特性,并配有简单移动的代码示例: 1. 关于初始化列表的,例如使用形如{1, 2, 3, 4, 5}为以前并不支持此种初始化方法的结构初始化,例如:std::vector等等。 http://www.bogotobogo.com/cplusplus/C11/C11_initializer_list.php 2. 更统一的

2017-01-11 21:53:35 3515

原创 C++11 reference collapsing and perfect forward (引用折叠以及完美转发)

引用折叠原则和完美转发是有联系的,可以说后者是基于前者的某些特性实现的,具体来看一下。 要理解完美转发,需要了解两个知识点: 1. 引用折叠原则(Reference collapsing rules)。 2. 右值函数模版参数类型推导(Template argument deduction)先看引用折叠。所谓引用折叠或者崩塌(collapse)既为当引用指向引用的时候,这里的引用可以是左值也可

2017-01-04 22:54:18 2026 1

原创 [读书笔记] 代码整洁之道(七)

琐事耽误,重新执笔。 十四,十五,十六章的内容是针对特定的例子的讲解,不做笔记。第十七章 味道与启发本章主要给出了一些代码中的坏味道以及一些启发,同时也有对前几章的总结和归纳,关于纯代码方面还可以参考《重构:改善已有代码的设计》一书。 整理几条个人认为比较容易忽略的。限制源文件中的语言数量由于不同的编程语言拥有不同的规则和格式,甚至是风格,而当他们混杂在一起时,很容易令人摸不着头脑,所以应该限制

2016-12-21 22:12:25 403

原创 [读书笔记] 代码整洁之道(六)

第十三章 并发编程并发编程或者说是多线程编程,可以有效的减少系统响应时间,增加系统吞吐量。 一些关于编写并发软件的中肯说法: 1. 并发会在性能和编写额外代码上增加一些开销。 2. 正确的并发是复杂的,即便是对于简单问题也是如此。 3. 并发缺陷并非总能重现,所以常被看作偶发事件而忽略,未被当作真的缺陷看待。 4. 并发常常需要对设计策略的根本性修改。并发防御的原则单一职责原则。要满足这

2016-12-04 23:14:09 405

原创 [读书笔记] 代码整洁之道(五)

继续整理本书本书的内容:第十一章 系统本章感觉更偏重Java语言本身,所以不做过多总结,总之,对于系统整体,可以通过运用合适的模式设计,保证系统的灵活性,引用部分原文的总结语: 系统应该是整洁的。在所有的抽象层级上,意图都应该清晰可辨。无论是设计系统或单独的模块,别忘了使用大概可以工作的最简单方案。第十二章 迭进有四条建议可以帮助我们创建具有良好设计的软件,让设计变得更“简单”: 1. 运行

2016-12-03 23:20:19 417

原创 [读书笔记] 代码整洁之道(四)

继续整理本书的内容。第八章 边界本章主要讲了如何控制代码的边界,己方代码与第三方代码之间,不同模块之间,核心的思想是,要保证边界整洁,需要透彻的浏览和学习边界,对边界内容进行过载的测试也是值得的,同时,对于尚未完成的依赖边界,要大胆的预使用它们,这样可以保证即便依赖之物尚未存在,仍不会耽误什么,同时,一旦依赖准备就绪,只需要少量的适配工作就可以很快的投入联调之中,Google的mock测试框架就是基

2016-11-29 23:20:43 397

原创 [读书笔记] 代码整洁之道(三)

继续本书读书笔记的整理。第五章 格式本章主要讲了代码排版方面的一些建议,当然这些只是建议,毕竟代码格式方面的东西每个公司甚至各个团队之间都可能不一样。 代码的格式说白了就是代码的风格,它跟代码的清晰度密切相关,代码可读性如何,很大程度上取决于代码的格式是否清晰。 可以从代码的横向和纵向连两个方向来观察代码的格式。横向格式最明显的就是代码的缩进,缩进可以从视觉上把代码分层,例如:if(A){

2016-11-27 16:19:24 352

原创 [读书笔记] 代码整洁之道(二)

继续整理本书的笔记。第四章 注释天真的年代里,我们认为代码里的注释就犹如公式旁边的备注,必不可少,越多与好,越详细越有用,常常技术头头们会把代码要有详细注释放在编码规范的头几条,甚至会有规定所谓的代码注释比,即多少行代码要配上多少行注释,每次代码复查时,“注释不够啊” “注释不清晰啊”头头A语重心长的对初级码农说道。现实的年代里,真的是这样的吗?一小组的人加班加点,不是在改bug,也不是在加新fea

2016-11-23 23:18:19 594

原创 [读书笔记] 代码整洁之道(一)

最近读完了马丁的clean code,颇有收获,简单整理下读书笔记,虽然整书是以Java代码做代码示例,但语言无国界,特别是编程语言更是如此,不管你从事的是以何种语言为主的开发环境,我相信,从本书中都会有所发现,有所收获。 全书总共17章,加上一个关于并发编程的附录,300多页的书,在面向程序员的书中,算不上厚。第一章 整洁代码本章主要是一个背景介绍和入门引导的作用,通过访问几个业界颇有建树的大师

2016-11-22 00:32:24 662

转载 C++ lambda表达式

Lambda表达式是自C++11之后加入的新特性,是一种类似匿名函数的东西,看了一片微软官网的介绍,浅显易懂,特地转载过来: 原文链接:https://msdn.microsoft.com/en-us/library/dd293608.aspxLambda Expressions in C++In C++11, a lambda expression—often called a lambda—i

2016-11-13 22:22:08 4266

原创 C++中如何通过无成员变量的空类存储数据

最近看到一个比较有意思的存储数据的方法,使用了类,但是不是使用成员变量来存储,所以称为假类(Fake Class)模式,觉得思路挺有意思的,拿来分享一下。整体思路思路比较独特,我们都知道类中如果没有成员变量,没有虚函数,也不是虚拟继承而来的子类,只有非虚成员函数,那么该类可以认为是个空类,也就是类的大小为0(此类型的类在实际编译器中大小一般为1,是为了唯一标识对象之用)。既然没有成员变量又该如何存储

2016-11-09 00:28:43 729

原创 关于错误map/set iterator not incrementable

今天Debug代码时,碰到一个关于迭代器的崩溃错误(仅限Debug模式,release会被容错):map/set iterator not incrementable,相关代码如下(仅演示思路代码)://pretypedeftypedef std::multimap<int, int>::iterator multimapIterator;typedef std::pair<multimapIt

2016-11-07 23:54:44 6848

原创 [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(下)

整理本系列笔记的最后一篇,关于运行时类型信息(RTTI)。保证安全的向下转型向下类型转换:是指由父类向子类的类型转换,由于父类信息少于子类,所以通常来说,没有特殊机制支持的话,这种转换是不安全的,要支持此机制的话,在空间和时间上都需要额外的负担: 1. 空间上,需要额外的空间存储类型信息,通常是一个指针,指向某个类型信息节点。 2. 时间上,需要额外的时间,已决定执行期的类型。 一种主流的策略

2016-11-01 23:51:02 462

原创 [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(中)

继续整理最后一章的内容,这一篇是关于异常处理的。注:初学markDown,所得尚少,排版简陋,多多包涵欲支持异常处理,编译器的主要工作是找出catch子句,追踪程序堆栈中每一个函数的当前作用域,编译器必须提供某种查询异常对象的方法,以知道其实际类型(RTTI来源),最后,编译器还需要某种机制管理被丢出的对象,包括其产生,存储,析构,清理。C++异常处理语法由三部分组成: 1. throw,抛出异常

2016-10-26 22:00:37 397

原创 解析C++中的new、operator new、operator new[]和delete、operator delete、operator delete[](下)

注:以下测试均在VS2015下进行,其他编译器可能会有轻微差别。继续整理第二部分的内容。二、operator new/delete,以及其对应的数组版本new[]/delete[]。operator new优先调用全局重载的,所以::operator new(sizeof(COperatorTest))和operator new(sizeof(COper

2016-10-23 23:28:13 1948

原创 解析C++中的new、operator new、operator new[]和delete、operator delete、operator delete[](上)

最近在为一个Base项目实现需求,看到了大量的重载operator new/delete的轮子代码,而这方面之前并没有过多去关注,于是花了点时间,查一查资料,写了写Demo的代码,总算是对C++中new/delete这一家族的成员有了个了解。我们一一来看。1. new/delete以及对应的数组版本new[]/delete[]操作符(operator)。这两组可以看作是一家的,也是我们

2016-10-19 23:28:06 2316

原创 [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(上)

整理最后一章的内容,关于模板,异常处理以及运行时类型信息的(RTTI: Run Time Type Information)。

2016-10-17 23:20:22 393

原创 [读书笔记] 深入探索C++对象模型-第六章-执行期语义学(下)

继续整理第六章剩下的内容,关于临时对象的几条准则。1. 在某些情况下,编译器可以产生必要的,或者可以带来方便的临时对象,具体行为由编译器来定义。例如,对于如下操作:T a, b;T c = a + b;//T operator+ (const T&, const T&)a. 编译器会产生一个临时对象,放置a+b的结果,然后使用T的拷贝构造函数,把临时对象当作c的初始值。b. 另外一种

2016-10-11 21:26:47 336

原创 [读书笔记] 深入探索C++对象模型-第六章-执行期语义学(中)

国庆假期小栖,继续整理第六章的内容。关于new和delete运算符。a. 使用new运算符构造对象时, 例如:Point3d* origin = new Point3d;会被转化为两个操作:分配空间和调用类的构造函数:Point3d* origin;if(origin = __new(sizeof(Point3d))){ origin = Point3d

2016-10-08 23:57:53 288

原创 [读书笔记] 深入探索C++对象模型-第六章-执行期语义学(上)

继续整理第六章的内容,关于执行期的一些内容。这一部分是关于对象的构造和析构的。注:以下部分图片来自于原文1. 全局对象C++中全局对象会被放到数据段中,一种可能的全局对象的初始化方法是在程序中最前面(main()函数第一个指令)插入函数__main(),其中生成对所有全局对象的初始化操作,如下图:2. 局部静态对象考虑一下函数:void Point& identit

2016-09-28 22:47:19 404

原创 [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(下)

继续整理第五章剩下的内容,关于析构函数语义的。1. 如果类没有定义析构函数,那么只有类中含有成员对象(或者本类的基类)拥有析构函数的情况下,编译器才会合成一个出来,否则析构函数被视为不要,也就不需要合成。例如,如下类,虽然Point类拥有虚函数:class Point {piblic: Point(float x = 0.0, float y = 0.0); Point

2016-09-26 22:25:58 466

原创 [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(中)

继续整理第五章的内容,关于对象复制的。 对于默认的拷贝赋值操作符,在如下情况下不会表现出按位拷贝(bitwise copy:关于按位拷贝,实际就是不使用拷贝构造函数或者拷贝赋值操作符,这里的不使用是指编译器根本不会产生,而是采用按位拷贝对象数据的方式,若对象中含有指针,此时的指针只是地址级别的浅拷贝,可能会引起内存问题):    a. 当类内带有一个含有拷贝赋值操作符的成员变量时。

2016-09-22 23:43:37 758

原创 [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(上)

继续整理第五章的内容,关于累的三个重要函数:构造函数,析构函数,拷贝构造函数。注:以下部分图片来自原书1. 无继承情况下的对象构造。当类中存在虚函数时,编译器会对该类产生膨胀作用, 例如如下类:class Point {public: Point(float x = 0.0, float y = 0.0) : _x(x), _y(y){} virtua

2016-09-20 00:17:30 766

原创 [读书笔记] 深入探索C++对象模型-第四章-Function语义学(下续)

第四章的最后,补充几点关于内联(inline)函数的:inline函数参数带有副作用,或者是以一个单一的表达式做多重调用,或是inline函数中有多个局部变量,都会产生临时对象,可能会产生大量的扩展码,是程序的大小膨胀,所以inline函数的使用必须要谨慎:1. 对于单一表达式的多重调用:对于如下incline函数:inline Point operator+ (const P

2016-09-18 00:16:47 342

原创 [读书笔记] 深入探索C++对象模型-第四章-Function语义学(下)

继续第四章的内容整理,这一部分也是第四章的最后一部分,是关于成员函数指针的,第三章下的内容整理是关于成员变量指针的,这个则是成员函数指针,二者可以互为参考。1. 非虚成员函数指针(非静态)。取一个非静态成员函数的地址,如果该函数是非虚函数,则得到的是它在内存中的真正地址,但是该地址并不完全,需要绑定与具体的类实例(对象)之上,借助对象的地址(this指针)才可以被调用,例如:一个成员函数指

2016-09-17 22:13:07 438

原创 [读书笔记] 深入探索C++对象模型-第四章-Function语义学(中续)

继续整理函数调用的第三种情况内容,注:以下部分图片来自于原文3. 虚拟继承情况下的虚函数调用: 如下例子,Point3d虚拟继承自Point2d:此时的内存布局如下,注意此时虽然Point3d只有唯一一个基类(最左边的)Point2d,但是它们的布局并不像非虚拟继承的单一继承那样,二者之间不再相符,二者之间的转换也就需要调整this指针,因为此时Point3d中

2016-09-14 23:28:35 369

原创 [读书笔记] 深入探索C++对象模型-第四章-Function语义学(中)

继续整理第四章的内容,注:以下部分图片来自于原文1. 单继承情况下的虚函数调用: 对于多态虚函数的调用(通过基类指针或者引用),例如ptr->z();,需要知道两个信息:    a. ptr所指对象的真实类型,这可以使我们选择正确的z()实体;    b. z()实体位置,以便可以调用它。结合以上的所需信息,需要为每一个多态的类对象身上增加两个成员:    a. 一个字符串

2016-09-13 21:22:01 668

原创 [C++] 关于子类声明与父类同名同类型的成员变量的问题

在编程语言的世界里,继承意味着子类中包含父类所有的一切。那么如果在子类中声明了跟父类名字以及类型都一样的成员变量时会如何处理?这个其实会涉及到C++中所谓的名字mangling的机制,所谓name mangling是指C++中为了区分输入的相同名字的东西,例如函数重载,多个虚表指针,等等,所以当出现前面提到的情况时,实际上编译器会把父类和子类的成员变量mangling化,使其独一无二,例如,如下两

2016-09-11 15:54:49 7593

原创 [读书笔记] 深入探索C++对象模型-第四章-Function语义学(上)

开始整理第四章的内容,关于函数的东西。1. 静态成员函数不可以是const的,原因是因为this指针,详细参考:http://blog.csdn.net/beyongwang/article/details/524036972. 成员函数可以分成几类:a. 非静态成员函数:此类函数会隐含一个this指针传入函数体,举个例子,对于如下函数:float A::non_Static_

2016-09-10 21:43:24 563

原创 [读书笔记] 深入探索C++对象模型-第三章 Data语义学(下)

整理第三章最后的部分内容,关于数据成员指针的,之前竟然没听过类数据成员指针一说,果然路漫漫其修远兮啊。注:以下例子和图片来源于原书。1. 数据成员指针是指指向类数据成员的指针,其内容为对应数据成员在类对象中的偏移量,类型为A::*,例如,如下类:class Point3d { public: virtual ~Point3d(); protected:

2016-09-05 22:27:40 473

原创 [读书笔记] 深入探索C++对象模型-第三章 Data语义学(中)

继续整理第三章的内容(以下部分图片来自于原书):1. 在只有继承没有多态的情况下,子类是的内容就是父类加上子类特有的数据成员,例如,对于如下两个类,Point2d和Point3d,后者公有继承自前者,此时的数据布局如下所示:在某些情况下,把一个类分解成多层,可能会导致类所占用空间的膨胀,例如,如下类,算上对齐操作大小为8 (4 + 1 + 1+1 +(1对齐)):而如果

2016-09-04 23:18:08 599

原创 C++中静态成员函数的常量型问题

这几天看深入探索C++对象模型时,看到一句话:静态成员函数不可以是常量函数,如下代码:class Test { virtual ~Test();public: static void StaTest();};如果StaTest()修改为:static void StaTest() const;VS2015中编译回报错误:'StaTest': modifiers not allowe

2016-09-01 21:47:43 1506

转载 C++ STL底层实现快速查阅

原文链接: http://blog.csdn.net/huangkq1989/article/details/7277282C++ STL 的实现:1.vector  底层数据结构为数组 ,支持快速随机访问2.list    底层数据结构为双向链表,支持快速增删3.deque   底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,

2016-08-28 20:13:26 497

转载 C++ POD 类型

原文链接:http://blog.csdn.net/bichenggui/article/details/4719363简单整理了下主要内容:最早看到POD(plain old data)类型,是在imperfect c++里。我觉得这是一本把我带到c++世界里的一本很重要的书。书里是这样解释POD的: 1、   所有标量类型(基本类型和指针类型)、POD结构类型、POD联

2016-08-28 20:07:44 470

原创 [读书笔记] 深入探索C++对象模型-第三章 Data语义学(上)

注:以下部分图片来自原书1. 关于类的大小,有三个因素会影响类的大小:a. 语言本身所造成的额外负担,例如虚基类,相应的子类会存在某种形式的指针,或者直接指向虚基类子对象,或者指向一个存放着虚基类子对象地址或者偏移量的表格。又如,虚函数,继承自含有虚函数基类的子类会含有一个指向虚函数表的指针。总之这些都会增加类对象的大小。b. 对齐操作,即为了使总线的传输效率达到最高,类大小会被进行对

2016-08-28 17:01:53 668

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除