C++
文章平均质量分 93
zilaishuichina
打工的
展开
-
自己的底层代码库(十八)——一些工具函数代码
之前的博文中一些提到但是没有单独列出来提供头文件的 函数。MemOffset,ContainerOfTEMPLATE_COMMA这里具体给一下:tool.h#ifndef _tool_h_#define _tool_h_#include //计算结构成员在结构中的偏移量#define MemOffset(ClassName, Memb原创 2014-07-17 11:49:21 · 946 阅读 · 0 评论 -
自己的底层代码库(十三)——锁
有人反应说之前#include "CLock.h"这个文件以前的博客没有提到我一看确实是,因为之前CLock是在第一篇博文单链表里面提到的后来容器类改写了,加了个基类,锁给提到基类里面去了于是一开始的第一篇单链表的博文在修改的时候,锁那一部分的说明就删掉了今天补上其实就是一个对CRITICAL_SECTION的封装#ifndef _CLock_h_#def原创 2013-06-07 09:30:19 · 784 阅读 · 0 评论 -
自己的底层代码库(一)——单链表
开头先介绍下背景,本人是做游戏服务器端开发的,最近项目不紧,所以一直计划着完善自己的一套底层代码库,包括容器,内存池,智能指针,网络,数据库,内存数据库等等。并在此基础上完成一个C/S的服务器架构设计。顺便提一句,我后续的这些代码,在可能的情况下,基本上都是采取空间换时间的思路,比如很多地方会在设计的时候多记录几个指针,达到更快的获取而不用搜索的目的。今天是第一篇,最基原创 2013-01-05 15:58:47 · 1509 阅读 · 2 评论 -
自己的底层代码库(二)——双链表
今天放上双链表的实现PS:2013.6.5修改了容器的实现:继承了后面提到的TContainer,实现相关接口。链表的定义TBDLinkList.h:#ifndef _TBDLinkList_h_#define _TBDLinkList_h_#include #include "TContainer.h"template class TBDLin原创 2013-01-08 14:40:27 · 1157 阅读 · 0 评论 -
自己的底层代码库(三)——AVL树
有段时间没更新,这几周公司在搞一个通讯底层TCP换UDP。另外之前发的单链表跟双链表的实现中,加锁的位置有问题,误导了大家,今天修正了下加了注释,之前如果看过的同学需要注意下。今天继续,放上一个AVL树的实现PS:2013.2.5修改了树的实现:1、将关键字K与值域T分离开来,重新更新相关代码,Remove函数以及Find函数(包括后面第四篇的效率测试代码一原创 2013-01-29 22:49:24 · 1479 阅读 · 0 评论 -
自己的底层代码库(四)——计时模块,以及效率测试
测试效率需要计时的模块所以首先发一下计时模块的代码,用的是QueryPerformanceFrequency跟QueryPerformanceCounterCPerformance.h头文件#ifndef _CPerformance_h_#define _CPerformance_h_#include class CPerformance{public: CPerf原创 2013-01-31 15:57:55 · 1744 阅读 · 1 评论 -
自己的底层代码库(五)——内存池,附加效率测试
明天回家了~~~~今天放上一个内存池的实现,该内存池基于之前发的单链表和双链表。并且参考了Apache内存池的实现。PS 2013.2.21修改:将之前的单链表管理的分配子改为AVL树管理2013.3.1修改:因为AVL树的结点结构有做修改内存池也做了相关功能的修改。主要是内存池分配子的查找操作,bool operator 增加了原创 2013-02-06 11:16:50 · 2335 阅读 · 8 评论 -
自己的底层代码库(六)——对象池
今天放上 对象池的实现思路类似于之前的内存池PS 2013.3.6修改:去掉了索引树以及搜索功能因为该功能可以通过TTree来实现,结点分配可以通过new,也可以通过内存池封装在对象池中反而显得不灵活索引功能的实现在下一篇文章中做简单介绍2013.6.26修改:由于容器、迭代器的修改,做相关调用的调整和之前原创 2013-02-27 11:38:10 · 971 阅读 · 0 评论 -
自己的底层代码库(七)——对象索引(修改)
之前想把索引功能集成到对象池中但是主要因为涉及到TTree的结点申请,结点申请用到内存池又涉及到多线程加锁的问题,而最理想的是一个线程一个内存池,不用加锁仔细考虑了下发现集成进去反而不是很灵活那么这里有多种实现方案1、直接用stl的map,之前map怎么用现在还是怎么用2、用TTree替代map(我不知道map里面是不是做了其他的维护操作,目前测下来TTree的查找原创 2013-03-07 10:44:06 · 1101 阅读 · 0 评论 -
自己的底层代码库(八)——获取函数调用堆栈
今天放上一个工具类,用来获取当前线程/所有线程的当前函数调用堆栈主要是为了方便用于在打log时,可以将调用堆栈一起输出到文件当中PS:想打出正确的log是依赖于PDB文件的类似于VS的向output窗口输出$CALLSTACK主要用了dbghelp的一些API参考了:http://www.cnblogs.com/zplutor/archive/2011/04/2原创 2013-04-03 16:17:19 · 6260 阅读 · 5 评论 -
自己的底层代码库(九)——插入式的双链表
之前发过一个 非插入式的这里之所以再发一个插入式的,是为了后面实现一个迭代器准备的将迭代器注册给容器的时候,容器里面单独用了这样一个双链表来管理所有在该容器上注册的迭代器又因为双链表本身就是容器的一种,出现了容器里面有容器的情况又不想用指针,指针意味着需要另行分配内存所以另外再实现了一个双链表,只用来管理容器上所有注册的迭代器至于链表的插入删除这种操作,跟之原创 2013-04-18 16:56:04 · 823 阅读 · 0 评论 -
自己的底层代码库(十一)——容器类基类
今天放上容器类的基类TContainer1、以下4个接口需要子类实现初始化\清空容器 virtual void Init(ContainerFlag dwLock) = 0;获取该容器中第一个T对象 virtual T *GetHead() = 0;获取该容器中curr的下一个T对象 virtual T *GetNext(T *curr) = 0;获取链表中c原创 2013-04-23 16:08:24 · 942 阅读 · 0 评论 -
自己的底层代码库(十二)——单例类
今天在论坛看到有人讨论单例跟多线程的问题,于是自己写了一个先上代码:TSingleton.h:#ifndef _TSingleton_h_#define _TSingleton_h_#include "CLock.h"template class TSingleton{public: TSingleton(); ~TSingleton(); stat原创 2013-06-05 15:39:29 · 1248 阅读 · 3 评论 -
自己的底层代码库(十四)——float的截断
最近在做游戏录像,遇到了一个因为不同的机器上浮点数计算出来的小数部分不一致,导致录像不一致的问题一开始选择的是 四舍五入 跟 直接截断 的方式发现效果并不是很好比如 9.987654在有些机器上是9.987654, 在有些机器上是9.987655那么保留5位小数,进行四舍五入就会导致结果不一致比如 3.999999在有些机器上是3.999999, 在原创 2013-07-11 18:04:03 · 852 阅读 · 0 评论 -
自己的底层代码库(十五)——对象队列
这也参照对象池的设计思想,队列实际上就是一个对象池但是队列没有对象池的malloc,free,只有PushObj,PopObjm_Used列表只能先进先出,不能随机访问,不能遍历它具有和对象池一模一样的分配子TObjectAllocator,队列结点由Allocator动态分配直接上代码TObjectQueue.h#ifndef _TObjectQueue_原创 2013-11-04 14:25:49 · 603 阅读 · 0 评论 -
自己的底层代码库(十六)——数组模板
这里放上一个数组模板,主要是封装了一下一维数组,和二维数组的原创 2014-07-09 12:19:15 · 1399 阅读 · 0 评论 -
自己的底层代码库(十七)——随机数池
实际开发过程中,可能会遇到这样的需求:在0到x范围内,生成n(n 这里给出一个简单的实现,其实就是以空间换时间的。定义长x的数组,对这个数组采用洗牌法打乱顺序,然后顺序的取前n个。Rand()一下则为重新洗牌。TRandPool.h#ifndef _TRandPool_h_#define _TRandPool_h_#include #incl原创 2014-07-09 12:27:13 · 1635 阅读 · 0 评论 -
自己的底层代码库(十)——迭代器
今天放上一个迭代器的实现主要解决一个问题:在多线程的环境下,保证各个迭代的完整性。1、多个线程在对同一个容器进行迭代,互不影响(容器自己有锁)2、若要迭代的下一个对象被移走,迭代器要可以正确的后移,指向再下一个要迭代的对象3、被迭代出来的当前对象被移走或释放,这个需要另外的措施保证(比如智能指针),迭代器不作处理4、已经被迭代过的对象序列中新插入了对象,本次迭代原创 2013-04-22 12:04:38 · 828 阅读 · 0 评论