开发语言
Horky
爱探索、爱技术!简单地快乐着!
展开
-
高效操作字串的String Reference类
只要不修改字串内容,并不需要另外复制一份。特别是对一些比较大的字串,避免拷贝对内存和性能都有极大的好处。于是Jeffrey Yasskin提出一个String reference : a non-owning reference to a string. 很多大型的项目都提供了各自的实现,包括Boost::StringRef, LLVM的StringRef, Chromium的base::StringPiece。原创 2016-02-06 06:57:01 · 4462 阅读 · 0 评论 -
Android SQLite性能分析
作为Android预置的数据库模块,SQLite精致而且强大,对它的深入理解对于提升应用的性能非常重要。这里对SQLite的性能和内存进行了一些测试分析,对比了不同操作的执行性能和内存占用的情况,粗略地列在这里算是作个小结。原创 2014-04-29 22:18:09 · 14419 阅读 · 4 评论 -
C++的RAII在WebKit中的应用
先看下面这段WebKit中的代码:{ NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); //Do something else...}看看NestingLevelIncrementer的实现,就知道与另一种写法看似是等价的:{ ++m_scriptNesting原创 2013-05-30 19:46:25 · 2086 阅读 · 0 评论 -
[WebKit]C++类的数据结构及在反汇编上的应用
在反汇编常常要在无法使用调试信息和源代码的情况下查看数据内容,数据结构比较好处理,如果是C++的类,就需要做些总结了。基础 - POD?C++的成员变量的排列顺序关键在于区别是不是POD(Plain Old Data)类型,从而确定是否需要有VPTR。POD类型会保持和struct相同的数据排列顺序,但在类的定义中不能出现虚函数、析构函数及拷贝的赋值函数等,否则编译器会增加一个Vi原创 2013-06-17 23:56:17 · 4376 阅读 · 1 评论 -
关于代码布局(Coding Layout)
研究发现,缩进可以提高程序员的理解能力(Program Indentation and Comprehensibility>>, Miaria et al. 1983)。缩进是代码布局的一项技术。作为代码布局并不像命名和注释那样明确,它更像一种感觉。比如摄影的构图,或者国画的留白。虽然很难给一个标准的评价标准,但是>的作者Steve.McConnell和>的两位作者还是给了一些建议。 首先原创 2012-07-25 23:10:49 · 2468 阅读 · 0 评论 -
面向对象其实不需要封装
Note: 这里的‘封装(Encapsulation)’指的是限制对象访问的语言特性,也被称为信息隐藏(information hiding)。翻译的初衷在于看看一些不同的想法,作者的思考在某个层次上是有道理的,但并是完全正确。总之这里有一个决策和角度的问题。没有封装的OOP?Python支持Object Oriented Programming, 却没有封装(encapsula翻译 2013-06-05 18:55:28 · 2751 阅读 · 0 评论 -
Mark-and-Sweep Garbage Collection
This section presents the mark-and-sweep garbage collection algorithm. The mark-and-sweep algorithm was the first garbage collection algorithm to be developed that is able to reclaim cyclic data s转载 2013-05-01 21:16:28 · 2219 阅读 · 0 评论 -
优化解耦的设计思考
基于开源项目进行开发已经越来越普遍,WebKit和Android都有很多的深度定制的版本。对这样庞大工程修改的逻辑越来越多,日后想要同步升级就要面对更大的复杂性和风险。跟随开源项目同步升级,寻求上层的创新和优化才比较适合未来的产品开发策略。深度定制的方式会遭遇越来越多的尴尬。修改是必要的,但如何最大化地降低耦合和隔离对原生代码逻辑的修改?逻辑碎片的风险也许大家都体会过。以下是我对一原创 2013-04-01 23:17:15 · 3465 阅读 · 0 评论 -
GDB秘技--调试时执行代码中的特定函数
在使用GDB调试程序时,有时遇到看到数据不知所云,必须对照定义才能看懂, 有时还要做些运算才能看出来,这样效率显然不高. 如果需要查看一个变量类的当前值,简单的数据类型还好说,如果遇到一些枚举型的变量或特殊条件,想要看到清晰的数据输出,就会比较繁琐. 好在GDB提供了一个调试时执行某个函数的功能:call, 在需要时能帮你解决大问题. 举个简单的例子,如果有一个类定义了一原创 2012-07-29 22:26:35 · 26042 阅读 · 8 评论 -
如何扩展Chromium各层的接口
添加新功能时,可能需要增加各层的接口,接口如何加?必然需要向Chromium的原则看齐。首先Chromium的模块设计遵循依赖倒置原则,上层模块依赖于低层模块,低层模块不会依赖上层模块的实现。原创 2014-12-22 23:39:13 · 4196 阅读 · 2 评论 -
大型项目开发: 头文件顺序
经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝对不能应用于大型项目环境中。 大型项目环境下必须有适当的约束,否则很容易变得难以控制并很难维护(摘自<<大规模C++程序设计>>)。下面以Chromium中运用的两个Coding Style中定义的头文件顺序为例说明。原创 2015-07-09 00:25:17 · 4732 阅读 · 2 评论 -
大型项目开发:谨慎使用智能指针
智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点:1.性能问题。因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高。2. 对象释放的时机不明确。比如std::auto_ptr,总让人感觉不明不白,从而引入一些隐晦的问题。原创 2015-07-13 00:30:37 · 6806 阅读 · 0 评论 -
何时使用static类(工具类)
一个static类,指全部成员都是static方法构成的,而没有任何成员变量, 也称为Utility class 或者Utility Pattern [参考: Utility Pattern].它可以在程序中直接使用该类的方法,而不用实例化.static class相对单例有更好的性能,原因是它的方法不需要实例方法的动态绑定 (static方法本身不能被复写)。 static类可以看作某一组方法的原创 2016-02-06 05:51:04 · 6139 阅读 · 0 评论 -
[OOD-More C++ Idioms] 内部类 (Inner Class)
不用通过多重继承就可以实现多套接口,同时可以自然地向上转换(Up-casting)。在单个抽象下提供相同接口的多个实现。翻译 2015-10-21 22:50:47 · 2464 阅读 · 0 评论 -
类是如何定义出来的
Object Oriented是多种软件设计方法中的一种,其核心目标是为了降低系统的复杂性,以及代码复用。在OO里,一个类(Class)代表了一组具有共同结构和行为的一组对象(Objects),是OO语言的基础。而类又是又如定义出来的呢?原创 2015-10-20 22:35:57 · 2496 阅读 · 0 评论 -
[OOD-More C++ Idioms] 律师与委托人 (Attorney-Client)
律师与委托人 (Attorney-Client)目的控制访问类实现细节的粒度。C++中的friend会开始类内部的所有细节,也因此破坏了封装性。C++没有提供可以选择性使用某一部分私有成员的方式,要么全部开放,要么全部拒绝。如果能选择确定需要使用到的一组成员,而不是全部,就可以降低耦合性。而这个律师与委托人的惯用法就可以精准的控制友元所能使用的成员。翻译 2015-10-17 23:57:47 · 2992 阅读 · 0 评论 -
Google C++ Style Guide的哲学
Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲。翻译 2015-09-30 01:45:12 · 3034 阅读 · 1 评论 -
名不符实的读写锁
有一种单一写线程,多个读线程并发的场景,比如测量数据的读取与更新,消费者会比较多,生产者只有一个。以下图为例: 左侧是一种经典的解法,对数据整个操作加锁。为了一个写数据线程,于将所有读线程也进行加锁显然有点浪费了。于是提出读写锁(Reader/Writer Lock), 即使是使用了读写锁,其本质也是一样的,而且在POSIX下的pthread它的内部实现是基于mutex,所以它的开销更大。如果原创 2015-08-07 00:12:51 · 2262 阅读 · 0 评论 -
Google C++ Coding Style:右值引用(Rvalue Reference)
Google C++ Coding Style: Rvalue Reference 右值引用是一个C++11特性,标记为T&&。GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用。并且不要使用std::Forward(提供的完美转发特性)。原创 2015-08-04 00:14:41 · 1978 阅读 · 0 评论 -
Google C++ Coding Style:引用参数
Google C++ Coding Style定义输入参数以值或者const引用形式传入,输出参数使用指针。 所有以引用形式输入参数必须加上const,即const T&的形式。即如下形式:void Foo(const string &in, string *out);在如下情况下, 可以使用const T*的形式: * 需要进行指针的判空 (即空指针是合理的)。 * 需要使用到输入参数的指针或引用形式原创 2015-07-29 00:43:55 · 2934 阅读 · 1 评论 -
汇编语言指令以及伪指令速查手册
汇编语言指令以及伪指令速查手册(备查)它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,B转载 2013-02-01 16:22:34 · 2396 阅读 · 0 评论 -
[Objective-C]为现有对象增加额外的实例变量/数据
想到要如何为所有的对象增加实例变量吗? 使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量(有为此使用查表法的,也算曲线救国吧)。不过从Mac OS X v10.6开始,系统提供了Associative References,这个问题就很容易解决了。我根据Objective-C Reference中的示例修改了一下,直接上代码了。重点是其中objc_setAs原创 2012-10-09 23:01:38 · 3435 阅读 · 0 评论 -
自然而然的设计
设计,似乎有点高深莫测! 一堆的模式、模型,让人无所适从。学了记不住,记住又用不上。我觉得设计应当是自然而然的事,从实际问题出发找出实际的解决方案就可以了。其实难点在于能不能看到问题。回想起12年前的2000年,当时刚进入一家ERP公司,被安排为一家灯饰公司"客制"(所谓客制就是定制的意思!)人事系统。当时系统总被客户抱怨薪资结算太慢,四千人的工资要跑一晚上。下班时开始结算,第二天原创 2012-09-12 00:57:02 · 7335 阅读 · 5 评论 -
圈复杂度评价及工具
转载请注明出处:http://blog.csdn.net/horkychen圈复杂度用来评价代码复杂度,以函数为单位,数值越大表示代码的逻辑分支越多,理解起来也更复杂。圈复杂度可以成为编码及重构的重要参考指标,以指导撰写可读性高的代码。有关圈复杂度的定义,可以自行搜索。《代码大全》有如下的定义:计算子程序中决策点数量的技术 (代码大全2,19章P458)1.由1计数,一直往原创 2011-11-21 16:18:57 · 8818 阅读 · 0 评论 -
JavaScript的面向对象设计
转载请注明出处:http://blog.csdn.net/horkychen依据W3C School的定义,Javascript是面向对象的语言, 虽然没有类(class),但到处是对象. 可以理解只有定义而没有声明, 直接用就行. 其中的每个对象都可以理解为一组Key-Value的组合.附上W3C School的说明: 面向对象语言的要求 一种面向对象语言需要向开发者提原创 2012-05-12 00:27:57 · 3802 阅读 · 3 评论 -
TCMalloc:线程缓存的Malloc [Webkit有其应用]
作者:Sanjay Ghemawat, Paul Menage原文翻译:ShiningRayTCMalloc要比glibc 2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试过的malloc都快。ptmalloc在一台2.8GHz的P4机器上(对于小对象)执行一次malloc及free大约需要300纳秒。而TCMalloc的版本同样的操作大约只需要转载 2012-05-23 10:00:51 · 2514 阅读 · 1 评论 -
[BoUML]用例图
使用BoUML可以轻松绘制用例图. *注意扩展关系的箭头(扩展了谁?),详细的有关箭头方向,可以参考:http://blog.csdn.net/TangZhongxin/article/details/4640248有些书上的箭头方向都会指错,读的时候要小心!原创 2011-10-11 01:15:19 · 1980 阅读 · 0 评论 -
[BoUML]生成代码
此处简单介绍一下运用免费的UML工具Bouml生成C++代码。在BoUML中的各个视图和组件基本有以下的结构: Project -> View -> Diagrams -> Components 每一个组件,原创 2011-10-07 13:24:21 · 2892 阅读 · 0 评论 -
《代码整洁之道》摘录---对象和数据结构
<br /> <br />6.1 数据抽象<br />隐藏实现并非只是在变量之间放上一个函数层那么简单。类并不简单地用getter和setter将变量推向外间,而是暴露抽象接口,以便用户无需了解数据的实现就能操作数据本体。<br />如下面是一个阅读器,需要获取当前阅读进度。接口定义如下:<br /> public interface PaperReader<br /> {<br /> double getTotalPages();<br /> double getCurre原创 2011-04-25 23:17:00 · 1782 阅读 · 0 评论 -
较好的代码维护实践
<br />在别人实现的基础上进行开发,基本是一种常态。特别是对原来的代码陌生的情况下,有没有什么好的实践方法呢?<br />基本原则:类似重构一样,尽量减少对原有流程和结构的修改,最好能兼容原有结构。上来就按自己的相法来修改代是比较容易的,这样做很大程度是因为理解原有的代码需要较长的时间且有一定的难度,但这样会增加系统的复杂度,也会引入许多不必要的风险。除非得到项目负责人的同意,否则相当然的直接动手重写,绝非是什么好事!<br />那么如何做呢?要花大量的时间从头阅读代码吗?你以为文档写得那么好吗?<br原创 2011-05-18 22:33:00 · 1900 阅读 · 0 评论 -
STL::List的对象存储与释放
<br />写了一个小程序,来检查一下List中如何管理存储的对象。<br />#include "stdafx.h"<br />#include <list><br />#include <iostream><br />using namespace std;<br />class MyClass<br />{<br /> public:<br /> int nMember;<br /> int * pMember;<br /> public:<br /> <br /> MyClass(原创 2010-10-17 22:13:00 · 3491 阅读 · 0 评论 -
检查程序对动态库的依赖
转载请注明出处:http://blog.csdn.net/horkychen测试程序时会出现找不到指定的库或库函数的错误,表示某个依赖库不存在或版本不正确。如果使用的是动态加载的动态库所依赖的包不存在,如果程序没有做好异常处理的话,会让你很难定位到问题。比如GDI+库。假设一个程序A,调用了动态库B,而B链接了GDI+,这时运行在Windows 2000上时,系统里没有GDI+的库,会导致A不原创 2011-11-02 00:16:46 · 7914 阅读 · 2 评论 -
函数的单一职责原则(SRP)
结构化编程强调单一出口的原则,其目的在于增强函数流程的逻辑性。本身这个原则有些过于死板,但其保持代码逻辑性的目的是非常正确的。在面向对象设计,我们都知道要遵循单一职责原则(SRP),而函数也应遵循这一原则,以保证函数体逻辑的清晰并且高内聚。 以下示例中,UpdateValue函数与下面m_value的赋值语句造成了逻辑的分散:当需要变更m_value的赋值逻辑时,往往会修改Up原创 2012-08-06 23:08:51 · 4652 阅读 · 0 评论 -
思维惯性引发的编程问题
为什么程序要了解思维的障碍,并要练习有意识的加以克服?这里举一个实际发生的问题。写代码像写作一样,有时思如泉涌,顺着思路就把一段代码写得有模有样。下面是一个状态码检查的例子(这种写法本身并不严谨,但这里要讨论是一个更为严重的问题.):typedef enum { STATE_DEFAULT, STATE_A = 1, STATE_B = 2, S原创 2012-08-07 22:03:53 · 2172 阅读 · 0 评论 -
混合使用Objective-C,C++和Objective-C++
之前有段时间,我参与了一项使用了C++库的Objective-C项目。写了一篇关于混编的文章,结果却出乎意料的成为Google搜索中关于Objective-C++的最靠前的结果之一。后来,Apple将基于LLVM的clang做为主选编译器。其作用之一就是可以保证Objective-C的演化,而GCC的进化却太慢了。之前文章就不太适用了,而且在这个过程,我也收到了一些回馈,这些都促使我写翻译 2012-09-02 23:42:59 · 64763 阅读 · 11 评论 -
解决循环引用的一个例子
最近在讨论设计时注意到一个循环引用的问题。它是在使用引用计数指针时发生的。如下图所示:ClassA和ClassB分属两个不同的线程,ClassB通常由ClassA发起请求创建,并由ClassA使用,ClassB则会在必要时通知ClassA一些事件。两者中各保留了对方的一个引用计数指针RefPtr。如果在析构时释放成员变量的话,就会发生循环引用的问题,导致两个对象释放失败。 最直原创 2012-08-29 23:57:44 · 4439 阅读 · 1 评论 -
调试程序时在不中断程序的情况下输出函数调用信息(Mac OS,Linux & Windows)
转载请注明出处:http://blog.csdn.net/horkychen有时在查找问题时,不想中断程序运行就输出一下某个条件下的函数执行顺序可以帮助定位问题。在Xcode下可以编辑断点设置中的Action设为Debugger Command, 如果你使用GDB作为调试器(项目设置),然后输入backtrace如下:记得勾选"Automatically continue原创 2012-06-25 21:54:49 · 8171 阅读 · 0 评论 -
《代码整洁之道》摘录---格式
团队应该一致同意采用一套简单的格式规则,可以运用将这些规则自动化的工具。代码格式关乎沟通,而沟通是专业开发者的头等大事。或许你认为“让代码能工作”才是专业开发者的第一优先级。你今天编写的功能,极有可能在下一版本中被修改,但代码的可读性却会对以后可能发生的修改行为产生深远影响。原始代码修改之后很久,其代码风格和可读性仍会影响到可维护性和扩展性。即便代码已不复存在,你的风格和律条仍存活原创 2011-04-16 15:29:00 · 2533 阅读 · 0 评论 -
编码工艺Coding Techniques)-命名和注释
转载请注明出处:http://blog.csdn.net/horkychen(节选自MSDN-Coding Techniques and Programming Practices)命名 (Names)命名最有利于了解程序的逻辑结构。一个名字说明是"什么(what)”比说明"如何(how)"更重要。通过命名可以避免暴露底层的实现,从而保留一个抽象层,简化了程序的复杂性。例如,你可以翻译 2012-07-17 01:15:58 · 2973 阅读 · 0 评论 -
[CodeComplete]创建一个函数需要理由吗
以下为代码大全2>>[第七章高质量的子程序]的摘录编程中什么是标准,相信大家都没有办法给出一套成系统的理论,而《代码大全》的作者就是在为我们描述从设计到实现诸多大家或意识到而没有深究,又或者还没有意识到的问题,通过系统的方式为大家展开了软件开发中诸多细节。希望对大家能都所帮助!本章探讨了以下问题: 创建子程序的正当理由 在子程序层上展开设计 起个好名字原创 2012-06-27 07:57:40 · 2814 阅读 · 0 评论