随笔分类 -  C/C++

摘要:利用public继承基类,可以将继承的结果分为两类:函数接口继承和函数实现继承. 声明一个纯函数的目的是为了让派生类只继承函数接口.纯虚函数有两个突出的特性: 它们必须被任何"继承了它们"的具体类重新声明,而且它们在抽象类中通常没有定义. 声明非纯虚函数的目的,是让派生类继承该函数的接口和缺省实现. 声明非虚函数的目的,是为了令派生类继承函数的接口及一份强制性实现. 对class进行设计时,声明成员函数,要谨慎选择,不同类型的声明意味根本意义不相同的事情. 下面是经验不足的设计者最常犯的错误: 1.将所有函数声明为非虚函数,相当派生类继承了函数接口和强制性实现,让派生类没有 阅读全文
posted @ 2012-07-16 09:23 一点心青 阅读(1960) 评论(0) 推荐(0)
摘要:假设你正在写一个视频游戏软件,游戏里有各种各样的人物,每个人物都有健康状态,而且不同的人物可能以不同的方式计算他们的健康指数.该如何设计游戏里的人物,主要如何提供一个返回人物健康指数的接口. 方法一,基于虚函数的方法. 在人物角色的基类增加一个成员函数heathValue,返回一个整数,表示人物的健康程度,并将声明为virtual.1 class GameCharacter {2 public:3 virtual int healthValue() const;4 ...5 }; heathValue声明为虚函数,因而派生类可以重新定义它,从而获得达到不同... 阅读全文
posted @ 2012-07-12 19:07 一点心青 阅读(1029) 评论(0) 推荐(0)
摘要:主要介绍利用library injection方法检测内存泄露.library injection就是重载库里面对应的函数,让程序调用library里的函数,而不是调用库函数里的函数.内存泄露主要是重载malloc和free函数,重载后,程序中调用malloc和free分配和释放内存时,就是利用自己编写的malloc和free函数.1.library injection如何完成?在linux环境下,可以利用LD_PRELOAD来指定编译好的重载库.具体的方法如下:1) g++ -shared -fPIC leakfinder.cpp -o leakfinder.so -ldl //编译得到重载 阅读全文
posted @ 2012-07-02 11:05 一点心青 阅读(2155) 评论(0) 推荐(1)
摘要:单源点最短路径问题 dijkstra算法伪代码算法思路如下:1).标记设定算法,将点集合分为S,U,集合S中是已标记的点集合,集合U中是未标记的点集合.2).初始状态,集合S中包含源点v0,集合U为V-v0.每次从U中选取源点到该点路径最小值加入集合S中,加入集合S后,更新v0到集合U中各点的路径值,并保存相应的路径信息.3).循环执行步骤2),直到集合U为空则算法结束.算法时间复杂度为O(n2),主要在求未标记的集合U中最小路径的点,需要遍历集合U中的元素.基于Dijkstra的改进方法,都是集中于此处,如何更快地求出未标记集合中的最小路径的点.改进方法,利用二叉堆或者斐波那契构建优先队列. 阅读全文
posted @ 2012-06-06 22:58 一点心青 阅读(1021) 评论(0) 推荐(0)
摘要:内存池是种用于分配大量大小相同的小块内存的技术,可以极大加快内存分配/释放过程.MemPool技术的内存分配,释放速度非常快,达到O(1)级别.缺点:1).只能分配特定字节长度的内存,也就是说,MemPool不是通用内存管理器.2).MemPool技术可能导致内存占用只增不减.基本实现如下:其中指针变量MemBlockHeader把所有申请的内存块(MemBlock)串成一个链表,以便通过它可以释放所有申请的内存.FreeNodeHeader变量则是把所有自由内存结点(FreeNode)串成一个链表.内存块大小一般固定为MemBlockSize字节(除去用以建立链表的指针外).内存块在申请之初 阅读全文
posted @ 2012-06-05 23:05 一点心青 阅读(2280) 评论(0) 推荐(0)
摘要:下面主要介绍STL中实现的内存空间配置器.关键点:1).考虑到小型区块所可能造成的内存破碎问题,设计了双层级配置器.当配置区块超过128bytes时,调用第一层级配置器,第一层级配置器直接使用malloc()和free().当配置区块小于128bytes时,调用第二层级配置器,采用复杂的memory pool整理方式,降低额外开销.2).内存池管理方式是每次配置一大块内存,并维护对应之自由链表.若有相同大小的内存分配,就直接从自由链表中分配内存块.若内存释放时,则由配置器回收到自由链表中.第二级配置器会主动将任何小额区块的内存需求量调至8的倍数.3).自由链表(free-list)节点的结构如 阅读全文
posted @ 2012-06-05 19:29 一点心青 阅读(1248) 评论(0) 推荐(1)
摘要:构造一个动态内存分器的设计空间很大,有多种块格式,空闲链表格式,以及放置,分割和合并策略可供选择.下面介绍的方法中,使用了隐式空闲链表和立即边界标记合并方式.总体思想:首先用malloc申请一大段内存空间,将这段内存空间看作整块的内存;内存分配算法采用了最简单的第一次匹配算法,即在第一次遇到满足请求的未使用的内存区域立刻分配给请求;内存释放时,根据内存区域的头域和尾域标识的分配情况进行合并处理.使用的堆块格式如下图所示:使用的隐式空闲链表格式如下图所示:操作空闲链表的基本常数和宏全局变量:主要的内部函数:外部接口函数:其中,内存释放时,合并可能出现的四种情况如下图所示:参考资料:深入理解计算机 阅读全文
posted @ 2012-06-05 13:06 一点心青 阅读(328) 评论(0) 推荐(0)
摘要:分配程序的全局变量分配程序的初始化函数sbrk()函数,用于动态增加内存空间.char *sbrk(int incr) incr为增加的字节数.内存控制块结构分配程序的释放函数分配程序的分配函数指针间的图示效果如下:mem_alloc_ptr为malloc()函数返回的可用区间指针.思考点:1).内存分配的底层编程主要技巧是强制类型的转换,以及一些指针间操作,进行编程实现时,需要画清相应示意图.2).该方法中,使用4字节来标识内存是否可用,有点浪费.3).该方法中,内存释放时,没有内存合并,将会产生许多内存碎片.4).该方法中,内存分配时,在最坏的情况下,需要遍历所有的内存块,效率低下.参考资 阅读全文
posted @ 2012-06-05 10:18 一点心青 阅读(323) 评论(0) 推荐(0)
摘要:问题描述:一批文件,文件有m列,n行,要计算每列数据对应的平均值.具体文件格式如下图所示:解决思路:awk 格式化处理文本文件,或者从文本文件抽取数据. 阅读全文
posted @ 2012-06-01 14:26 一点心青 阅读(5647) 评论(1) 推荐(0)