高效操作字串的String Reference类

只要不修改字串内容,并不需要另外复制一份。特别是对一些比较大的字串,避免拷贝对内存和性能都有极大的好处。于是Jeffrey Yasskin提出一个String reference : a non-owning reference to a string. 很多大型的项目都提供了各自的实现,包括Boost::StringRef, LLVM的StringRef, Chromium的base::StringPiece。...
阅读(2776) 评论(0)

何时使用static类(工具类)

一个static类,指全部成员都是static方法构成的,而没有任何成员变量, 也称为Utility class 或者Utility Pattern [参考: Utility Pattern].它可以在程序中直接使用该类的方法,而不用实例化.static class相对单例有更好的性能,原因是它的方法不需要实例方法的动态绑定 (static方法本身不能被复写)。 static类可以看作某一组方法的...
阅读(2920) 评论(0)

[OOD-More C++ Idioms] 内部类 (Inner Class)

不用通过多重继承就可以实现多套接口,同时可以自然地向上转换(Up-casting)。 在单个抽象下提供相同接口的多个实现。...
阅读(1680) 评论(0)

类是如何定义出来的

Object Oriented是多种软件设计方法中的一种,其核心目标是为了降低系统的复杂性,以及代码复用。在OO里,一个类(Class)代表了一组具有共同结构和行为的一组对象(Objects),是OO语言的基础。而类又是又如定义出来的呢?...
阅读(1704) 评论(0)

[OOD-More C++ Idioms] 律师与委托人 (Attorney-Client)

律师与委托人 (Attorney-Client)目的控制访问类实现细节的粒度。C++中的friend会开始类内部的所有细节,也因此破坏了封装性。C++没有提供可以选择性使用某一部分私有成员的方式,要么全部开放,要么全部拒绝。 如果能选择确定需要使用到的一组成员,而不是全部,就可以降低耦合性。而这个律师与委托人的惯用法就可以精准的控制友元所能使用的成员。...
阅读(2249) 评论(0)

Google C++ Style Guide的哲学

Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则。但作为一个最具影响力的编码规范,它里面有许多内容值得我们研究学习。以下主要摘自GSG负责人Titus Winters在CppCon 2014上的演讲。...
阅读(2074) 评论(1)

名不符实的读写锁

有一种单一写线程,多个读线程并发的场景,比如测量数据的读取与更新,消费者会比较多,生产者只有一个。以下图为例: 左侧是一种经典的解法,对数据整个操作加锁。为了一个写数据线程,于将所有读线程也进行加锁显然有点浪费了。于是提出读写锁(Reader/Writer Lock), 即使是使用了读写锁,其本质也是一样的,而且在POSIX下的pthread它的内部实现是基于mutex,所以它的开销更大。如果...
阅读(1570) 评论(0)

Google C++ Coding Style:右值引用(Rvalue Reference)

Google C++ Coding Style: Rvalue Reference 右值引用是一个C++11特性,标记为T&&。GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用。并且不要使用std::Forward(提供的完美转发特性)。...
阅读(1315) 评论(0)

Google C++ Coding Style:引用参数

Google C++ Coding Style定义输入参数以值或者const引用形式传入,输出参数使用指针。 所有以引用形式输入参数必须加上const,即const T&的形式。即如下形式:void Foo(const string &in, string *out);在如下情况下, 可以使用const T*的形式: * 需要进行指针的判空 (即空指针是合理的)。 * 需要使用到输入参数的指针或引用形式...
阅读(1592) 评论(1)

大型项目开发:谨慎使用智能指针

智能指针使用上的问题智能指针的使用太普遍了,它让程序员摆脱了内存管理的恶梦,但实际上智能指针本身也可能引入另一个恶梦。主要包括两个问题点: 1.性能问题。因为需要引入一些变量(bookkeeping),甚至在多线程下的一些互斥操作,它所带来的性能开销往往比想像的要高。2. 对象释放的时机不明确。比如std::auto_ptr,总让人感觉不明不白,从而引入一些隐晦的问题。...
阅读(2978) 评论(0)

大型项目开发: 头文件顺序

经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝对不能应用于大型项目环境中。 大型项目环境下必须有适当的约束,否则很容易变得难以控制并很难维护(摘自<>)。下面以Chromium中运用的两个Coding Style中定义的头文件顺序为例说明。...
阅读(2849) 评论(1)

如何扩展Chromium各层的接口

添加新功能时,可能需要增加各层的接口,接口如何加?必然需要向Chromium的原则看齐。首先Chromium的模块设计遵循依赖倒置原则,上层模块依赖于低层模块,低层模块不会依赖上层模块的实现。...
阅读(2881) 评论(1)

Android SQLite性能分析

作为Android预置的数据库模块,SQLite精致而且强大,对它的深入理解对于提升应用的性能非常重要。这里对SQLite的性能和内存进行了一些测试分析,对比了不同操作的执行性能和内存占用的情况,粗略地列在这里算是作个小结。...
阅读(11945) 评论(6)

[WebKit]C++类的数据结构及在反汇编上的应用

在反汇编常常要在无法使用调试信息和源代码的情况下查看数据内容,数据结构比较好处理,如果是C++的类,就需要做些总结了。 基础 - POD? C++的成员变量的排列顺序关键在于区别是不是POD(Plain Old Data)类型,从而确定是否需要有VPTR。POD类型会保持和struct相同的数据排列顺序,但在类的定义中不能出现虚函数、析构函数及拷贝的赋值函数等,否则编译器会增加一个Vi...
阅读(3719) 评论(1)

面向对象其实不需要封装

Note: 这里的‘封装(Encapsulation)’指的是限制对象访问的语言特性,也被称为信息隐藏(information hiding)。翻译的初衷在于看看一些不同的想法,作者的思考在某个层次上是有道理的,但并是完全正确。总之这里有一个决策和角度的问题。  没有封装的OOP? Python支持Object Oriented Programming, 却没有封装(encapsula...
阅读(2200) 评论(0)
43条 共3页1 2 3 下一页 尾页
    个人资料
    • 访问:1521773次
    • 积分:16747
    • 等级:
    • 排名:第615名
    • 原创:221篇
    • 转载:30篇
    • 译文:47篇
    • 评论:362条
    微博/MSN/EMail

    新浪微博:Horky
    QQ:324014340
    Mail:horky.chen@gmail.com
    微信公众号 (聚焦软件开发):
    博客专栏
    最新评论