C++
QQ276592716
这个作者很懒,什么都没留下…
展开
-
如何组织编写模板程序
前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(在*转载 2012-04-17 11:09:32 · 983 阅读 · 0 评论 -
并查集(union-find set or DisjointSets)
l 并查集:(union-find sets)一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。l 并查集的精髓(即它的三种操作,结合实现代码模板进行理解):1、Make_Set(x) 把每一个元素初始化为一个转载 2013-04-10 11:14:15 · 3221 阅读 · 0 评论 -
return后的一些释放~
如果想在函数 return后进行一些资源的释放,用一个类封装要做的事,在其析构函数中完成释放的代码。原创 2013-06-10 17:48:17 · 1269 阅读 · 0 评论 -
虚函数实现原理
前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我转载 2013-06-08 23:50:57 · 537 阅读 · 0 评论 -
纯虚函数的默认实现
在帮新同事进行代码审查的时候,常常会发现这样的问题:代码中原有基类B和派生类D1,现在新加一个派生类D2,它有一个函数f2()。由于经验不足,新同事并没有注意到D1也有类似的函数f1()。于是造成了类似的代码出现在了两个地方,代码冗余造成将来的维护工作异常困难。注意到f()实际上是一个通用的行为,我们可以把它抽出来放到基类中,如下所示。class B { pub转载 2013-06-08 20:37:58 · 931 阅读 · 0 评论 -
编程之美-快速寻找满足条件的2个数(扩展问题)的一个解法的注释
原题是: 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值? 这个可以将数组排序,然后前后各一个指针向中间靠拢寻找。扩展问题1: 如果将问题中的“两个数字”改成“三个数字”或“任意个数字时”,你的解答时什么? 写了一段代码,查找一个集合中是否存在一个子集,其中数字之和等于给定的值(given),有则返回子集,没有就返回空。/* *原创 2013-07-05 19:17:26 · 942 阅读 · 0 评论 -
简单的一个异步框架~
代码从leveldb中挖来,http://blog.csdn.net/qq276592716/article/details/8899829 这边说了windows里面的比较高效的异步解决方案~PosixEnv::PosixEnv() : page_size_(getpagesize()), started_bgthread_(false) {原创 2013-06-23 21:54:15 · 2047 阅读 · 0 评论 -
chromium r197479g版本编译运行
版本:chromium.r197479g参考官方文档:http://dev.chromium.org/developers/how-tos/build-instructions-windows1.环境:win7 64位 8G内存2.下载 VS20103.安装VS2010 SP14.安装 windows 8 SDK 位置默认,不改动5.安装 June 2010 Direc原创 2013-07-26 10:21:42 · 1214 阅读 · 0 评论 -
chronmium IPC的调试心得~
cronmium默认是一个tab一个进程,主进程获得需要的URL,通过IPC消息传递给render进程。render进程进行网络请求,显示。调试:1.VS调试里面附加到进程,进行多进程调试。2.如何知道我们要调试的进程的进程ID?在沙盒的代码 target_process.cc中的 if (!::CreateProcessAsUserW(lockdown_token_,原创 2013-08-14 14:40:14 · 1521 阅读 · 5 评论 -
标准C++类string的Copy-On-Write技术(三)
2.3.4、 Copy-On-Write的具体实现是怎么样的? 最后的这个问题,我们主要解决的是那个“民主集中”的难题。请先看下面的代码: string h1 = “hello”;string h2= h1;string h3;h3 = h2; string w1 = “world”;string w2(“”);w2=w1;转载 2013-08-22 00:14:15 · 688 阅读 · 0 评论 -
使用ATL 窗口类
ATL窗口类并不难学,但是许多开发者认为既然有强大的MFC支持,为什么还要同时学习ATL 窗口开发?这是因为MFC强迫你使用应用程序框架结构,同时存在代码过大,性能低下的问题,你还必须审查基于文档和文档模块的连载机制的持续有效性。使用ATL 窗口类的另一个大好处当然就是易于整合COM支持。如果你希望应用程序更快,更小,并且在选择应用程序结构和连续性协议方面更有弹性,你就不能不试试ATL。转载 2013-03-27 17:56:34 · 979 阅读 · 0 评论 -
网络编程:Reactor与Proactor的概念
两种I/O多路复用模式:Reactor和Proactor一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关转载 2013-03-21 21:54:57 · 734 阅读 · 0 评论 -
int GetMonth( ) const throw( );后面的throw( )什么意思?
异常规范(Exception Specifications)throw后面规定了该函数允许抛出什么类型的异常,空表示不抛出任何异常。这样写函数声明后,你在实现GetMonth时就不能有任何throw语句。如果写为 int GetMonth( ) const throw(string);函数实现时可以抛出string对象,其它类型的对象不允许。嗯,其实应该就是为了在异常处理的转载 2012-06-02 12:17:55 · 4682 阅读 · 3 评论 -
stl中list的sort算法实现
STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序,代码长度到不长,但真是难以读懂,后来扣持了一下午终于搞明白了,贴个总结上来。list::sort的代码如下(sgi stl):template void list::sort()转载 2012-09-01 16:17:01 · 6758 阅读 · 4 评论 -
保存个单例类~
#pragma once#define DECLARE_SINGLETON(className) \ private: \ className(){ Init();} \ friend Singleton; template class Singleton { public: Singleton(void){原创 2012-08-28 10:47:54 · 611 阅读 · 0 评论 -
C++设计新思维中的判断A是否继承B~
template class CConversion{ typedef char Small; class Big{char dumppy[2];}; static Small Test(U); static Big Test(...); static T MakeT();public: enum{exist=sizeof(Test(MakeT()))==siz原创 2012-09-29 17:10:59 · 1583 阅读 · 0 评论 -
C++编程智能指针循环引用解决
C++中智能指针的引入,使得开发人员在与内存的斗争中占据上峰。然而凡事都不会尽善尽美,智能指针的循环引用缺陷还是会引发令人谈虎色变的内存泄露。本文的内容就是讲述,如何解决循环引用带来的内存问题。 背景:智能指针采用Boost库,语言C++,开发工具VS2005,示例程序为Win32程序。 关于Boost库的使用,可见另一篇文章http://blog.csdn.net/segen_jaa转载 2012-10-27 21:14:28 · 753 阅读 · 0 评论 -
template template
#include#include#includeusingnamespace std;/*如果有一个需求是在自定义类中使用某种类型(T)元素,固定容器(vecter)*/templateclassT>classClassA{public: vector vecT;};//如果需求变成在自定义类中使用固定类型(int)元素,不同容转载 2012-12-16 00:54:11 · 765 阅读 · 0 评论 -
c++ 虚函数机制 效率问题
今天在c++坛子里瞎逛,看到精华坛里在讨论“为什么虚函数效率低”的问题,××楼主回答面试官说“跟cpu流水线执行效率有关” ××某人回答“因为虚函数需要一次间接的寻址... 而一般的函数可以在编译时定位到函数的地址,虚函数(动态类型调用)是要根据某个指针定位到函数的地址. ” ×ד虚函数有个虚函数表,而且会传一个index索引~!会间接寻址!”×ד流水线执行的话,转载 2012-12-18 21:19:01 · 742 阅读 · 0 评论 -
Thunk 技术的一个改进
Thunk技术,一般认为是在程序中直接构造出可执行代码的技术(在正常情况下,这是编译器的任务)。《深度探索C++对象模型》中对这个词的来源有过考证(在中文版的162页),说thunk是knuth的倒拼字。knuth就是大名鼎鼎的计算机经典名著《The Art of Computer Programming》的作者,该书被程序员们称为“编程圣经”,与牛顿的“自然哲学的数学原理”等一起,被评为“世界历转载 2013-03-30 10:27:11 · 621 阅读 · 0 评论 -
判断两个链表是否有公共节点并返回第一个公共节点
判断两个链表是否有公共节点的方法最简单的就是遍历到每个链表的最后一个节点,看他们是否是同一个节点:如果是同一个节点的话,那么两个链表肯定有公共节点:解释:因为链表是线性结构,不想树那样的非线性分叉结构从链表的定义,就知道:[c-sharp] view plaincopytypedef struct LNode{转载 2013-03-19 00:09:04 · 1024 阅读 · 0 评论 -
标准C++类string的Copy-On-Write技术(二)
2.2、 深入在深入这前,通过上述的演示,我们应该知道在string类中,要实现写时才拷贝,需要解决两个问题,一个是内存共享,一个是Copy-On-Wirte,这两个主题会让我们产生许多疑问,还是让我们带着这样几个问题来学习吧:1、 Copy-On-Write的原理是什么?2、 string类在什么情况下才共享内存的?3、 string类在什么情况下触发写时才转载 2013-08-22 00:12:29 · 809 阅读 · 0 评论 -
标准C++类string的Copy-On-Write技术(一)
标准C++类std::string的内存共享和Copy-On-Write技术 陈皓1、 概念 Scott Meyers在《More Effective C++》中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类转载 2013-08-22 00:11:38 · 856 阅读 · 0 评论 -
SPFA算法
【算法流程】算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。这个算法,简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法SPFA——Shortest Path Faster Algorithm,它可以在转载 2013-08-22 11:30:16 · 744 阅读 · 0 评论 -
网络编程中的reactor与proactor
首先,他们都解决了等待多个事件发生的问题,对多个事件源进行了多路分解。效率上面:reactor在缓冲区与内核的拷贝上面比proactor多了好几次,reactor在事件发生的时候是串行执行的,而proactor支持异步操作。引用别人的一个说法:reactor完成的时候只是告诉你有可读或者可写等消息,proactor已经帮你读到你要的缓冲区里面了。reactor比原创 2014-02-13 20:12:00 · 1008 阅读 · 0 评论 -
使用异步过程调用(APC)实现模块注入
摘自:windows编程循序渐进 异步过程调用是一种能在特定线程环境中异步执行的系统机制。往线程APC队列添加APC,系统会产生一个软中断。在线程下一次被调度的时候,就会执行APC函数,APC有两种形式,由系统产生的APC称为内核模式APC,由应用程序产生的APC被称为用户模式APC。 每个线程都拥有自己的APC队列。应用程序可以使用函数把APC添加到指转载 2014-02-13 19:40:07 · 788 阅读 · 0 评论 -
设计模式- 主动对象(Active Object)
译者注:1. 对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为。在多线程程序中,经常把一个线程封装到主动对象里面。2. 在翻译过程中,发现的原文不妥处被更正。3. 原文中许多内容一再重复,颇有蛇足之感,取精用宏,删繁就简。4. 尝试更高程度的意译。关键词这个文章转载 2014-02-18 19:06:12 · 1484 阅读 · 1 评论 -
浅谈 non-blocking I/O Multiplexing + poll/epoll 的正确使用
在前面的文章中曾经粗略讲过poll,那时是用阻塞IO实现,在发送和接收数据量都较小情况下和网络状况良好的情况下是基本没有问题的,read 不会只接收部分数据,write 也不会一直阻塞。但实际上poll IO复用经常是跟非阻塞IO一起使用的,想想如果现在内核接收缓冲区一点数据没有,read 阻塞了,或者内核发送缓冲区不够空间存放数据,write 阻塞了,那整个事件循环就会延迟响应,比如现在又有转载 2014-03-19 15:36:12 · 880 阅读 · 0 评论 -
Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂转载 2014-03-24 17:33:10 · 725 阅读 · 0 评论 -
引用技术接口的几个问题?
有个网络通信类,主要执行是在另外一个线程。但是在线程执行的时候,对象很可能已经析构了。所以接口设计为class PostCallBack:public base::RefCountedThreadSafe{public:virtual void ProcessData(string data,string flag)=0;virtual BrowserThread::I原创 2014-03-25 09:39:02 · 759 阅读 · 0 评论 -
splice系列系统调用
关注splice系列系统调用(包括splice,tee和vmsplice)已经有一段时间了,开始的时候并未能领会splice的意义所在,致使得出了“splice系列系统调用不怎么实用”的错误结论。随着内核研究的深入,才逐渐懂得:splice对于其中一个文件描述符必须是管道的要求并不是阻碍其应用的障碍,并且恰恰相反,它正是splice的本质所在。splice主要通过去除在内核空间和用户空间之转载 2014-04-06 21:38:48 · 2308 阅读 · 0 评论 -
C++的Trace类需要注意的问题~
.Trace类跟踪项目函数的模块调用原创 2014-05-25 01:06:27 · 2043 阅读 · 1 评论 -
windows下捕获dump
一般要捕获异常只需要两个函数:SetUnhandledExceptionFilter截获异常;MiniDumpWriteDump写dump文件。但是由于CRT函数可能会在内部调用SetUnhandledExceptionFilter(NULL),解除我们程序设置的异常处理,这导致我们的程序无法完整捕获崩溃。另外,还有一部分非异常的CRT错误,不属于SEH异常捕获的范畴,需要通过_set_inval转载 2014-08-10 19:48:18 · 836 阅读 · 0 评论 -
一个写优先的读写锁实现
/* g++ -Wall -o rwlock rwlock.cpp -lpthread** 一个写优先读写锁的实现,多线程频繁读,多线程少量写,同时写优先,性能极佳。* 当写锁(独占锁)lock成功的必要条件是:* 1. 将写锁计数++;* 2. 会阻塞后续对读锁(共享锁)的读;* 3. 等待读锁的计数为0;* 4. 等待写锁的计数为1;**/#includ转载 2014-02-23 16:28:55 · 1427 阅读 · 0 评论 -
[Chrome源码阅读] 理解Chrome的smart pointer
Chrome代码中大量运用了智能指针来管理对象的指针,解决对象生命期的问题。这篇文章尝试着理解Chrome中定义的几个智能指针类。1. scoped_ptr/scoped_array/scopred_array_malloc以scopred开头的智能指针类定义在/src/base/scoped_ptr.h文件中。它们有着很明确的设计目标,对new/new[]/malloc出来的对象转载 2013-11-14 16:05:17 · 825 阅读 · 0 评论 -
外部排序技术之多路归并
外部排序技术之多路归并重点:败者树的创建调整函数1.外部排序概述外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装人内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。转载 2013-08-15 09:07:18 · 908 阅读 · 0 评论 -
以boost::function和boost:bind取代虚函数
这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应用程序的编写方式。Scott Meyers的Effecti转载 2013-10-06 09:54:57 · 677 阅读 · 0 评论 -
volatile语义及线程安全singleton模式探讨
作者:Scott Meyers and Andrei Alexandrescu 译者: ChengHuige at gmail.com1.引言 详尽的讨论了volatile语义以及如何用C++实现线程安全的Singleton模式。 主要参考Scott Meyers and Andrei Alexandrescu写的“C++ and the Perils of Doubl转载 2013-10-13 15:59:41 · 1079 阅读 · 0 评论 -
cocos2d-x定时器设计的一些想法
cocos2d-x中的定时器有2种。Update定时器,每个节点只能注册一个定时器,因此调度器中存储定时器数据的结构体主要保存了注册节点和优先级。每一帧通过迭代调用链表中节点的Update函数来实现Update定时器。普通interval定时器,每个节点能注册多个定时器,引擎使用回调函数(选择器)来区分同一个节点的不同定时器。调度器为每一个定时器创建了一个CCTimer对象,它记录了定时器原创 2013-10-29 09:07:07 · 833 阅读 · 0 评论 -
cocos2d-x精灵内存管理
1bool HelloWorld::init() 2{ 3 bool bRet = false; 4 do 5 { 6 ////////////////////////////////////////////////////////////////////////// 7 // super init first 8 ////原创 2013-10-23 14:19:00 · 2979 阅读 · 0 评论