m2014_c->c语言容器类工具列
转自:http://www.cnblogs.com/sniperHW/category/374086.html
- cocos2dx内存管理
摘要: cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象.cocos2dx的对象管理是树形结构的,可通过调用父亲节点的addChild成员函数将一个子节点对象...阅读全文
- luanet更名为distri.lua
摘要: 为了更好的体现luanet的设计意图和避免与网上另一个开源项目重名造成混淆, luanet正式更名为distri.lua.后需开发工作包括跨平台,日志,通过Fork创建新线程正在开发中.新地址:https://github.com/sniperHW/distri.lua阅读全文
- epoll实现机制分析
摘要: 本文只介绍epoll的主要流程而不是分析源代码,如果需要了解更多的细节可以自己翻阅相关的内核源代码.相关内核代码:fs/eventpoll.c判断一个tcp套接字上是否有激活事件:net/ipv4/tcp.c:tcp_poll函数每个epollfd在内核中有一个对应的eventpoll结构对象.其中关键的成员是一个readylist(eventpoll:rdllist)和一棵红黑树(eventpoll:rbr).一个fd被添加到epoll中之后(EPOLL_ADD),内核会为它生成一个对应的epitem结构对象.epitem被添加到eventpoll的红黑树中.红黑树的作用是使用者调用EPOL阅读全文
- golang文件传输服务
摘要: 续上篇,本篇介绍一个完整的golang文件传输服务器。完整的代码可以看服务器,客户端网络使用的框架如上篇介绍,这里就不再复述.首先定义3个命令码:const ( request_file = 1 file_size = 2 transfering = 3)request_file用于请求文件传输,附带的命令参数是文件key.file_size用于通告客户端文件的大小.transfering用于传输文件内容,附带参数是文件内容的二进制数据.服务器的文件配置示例../learnyouhaskell.pdf=haskell../golang.1.1.2.chm=golang../N...阅读全文
- golang初体验
摘要: 学习golang的时间断断续续加起来也有将近一个月了,这期间都是偶看翻几页书,没有写过实际的代码.最近做一个app项目,是一个展示类 的软件,当客户要看某个图片时首先向服务器发出一个请求,比对图片的版本,如果版本与本地一致,则直接显示,如果版本落后了则由服务 器将最新的版本发送给客户端.对服务器的需求就是一个简单的版本比对和文件传输,于是打算用go去实现,正好也可以练练手.在设计上,受到以往框架设计的影响,还是使用了wpacket,rpacket和共享buffer这个方案,不同的地方是go的网络API不支持gather io,所以buffer没有被实现为buffer list,而是一整块的连续阅读全文
- 池式对象分配
摘要: 有了tcmalloc和jemalloc,在大多数情况下我们都没有必要再自己写通用的内存分配器(应该说对于极大多数的程序员,都不可能写出比这个两个更好的通用内存分配器)。但是,如果对性能有极致的要求,写一个比通用内存分配器效率更高的池式对象分配器是可能的。一个最简单也高效的实现就是freelist,每次分配的时候从freelist中get一个,释放的时候put回去就好了。其实现在单线程下是相当简单的,也就几十行代码。但是在多线程的环境下,问题稍微复杂一点,因为可能有多个线程需要操作freelist,那么就要用锁去保护这个freelist,每次get和put的时候都要加锁显然会导致freelist阅读全文
- 使用kendynet构建异步redis访问服务
摘要: ##使用kendynet构建异步redis访问服务最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用string基本就足够了。于是在kendynet上写了一个简单的redis异步访问接口.###设计理念1.项目时间紧迫,不打算提供一个大而全的访问接口,只提供一个request接口用以发出redis请求.2.数据在redis中key和value都存储为string,由使用者负责将数据序列化成string,从string反序列化回数据.3.服务支持本地访问和远程访问,服务自动根据请求发起的位置将结果返回给阅读全文
- Astar算法框架
摘要: 首先本文并不打算详细的介绍A*算法,要想大致的了解A*算法可参看下面两篇文章:http://wenku.baidu.com/view/d39faba1284ac850ad02425d.htmlhttp://wenku.baidu.com/view/eaa14f11f18583d049645992.html其次,不用太纠结算法的效率,例如remove_min_pnode函数使用线性探索寻找最小值,实际上可以使用二叉堆或别的方法提高执行效率.本文的目的是提供一个较通用的A*框架,用于解决游戏中的寻路问题.首先看下结构的定义://一个地图块节点struct map_node{};//路径节点stru阅读全文
- C协程实现的效率对比
摘要: 前段时间实现的C协程依赖栈传递参数,在开启优化时会导致错误,于是实现了一个ucontext的版本,但ucontext的切换效率太差了,在我的机器上执行4000W次切换需要11秒左右,这达不到我的要求,所以重新设计了实现,使得在开启优化时也能得到正确的结果.并且效率也令人满意,4000W次切换仅需要730ms左右,足足比ucontext的实现快乐近15倍。下面贴出实现:#include "uthread.h"#include <stdlib.h>#include <ucontext.h>#include <pthread.h>#includ阅读全文
- 各种内存分配器的对比测试
摘要: 最近两天测试了下tcmalloc,性能的确牛B.所以修改了下固定对象分配器,模仿tcmalloc利用tls做thread cache.下面是在我机器上对自己写的各个内存分配器与tcmalloc的对比测试,fix_obj_pool finish:326fix_obj_pool finish:165fix_obj_pool finish:168fix_obj_pool finish:164fix_obj_pool finish:174fix_obj_pool finish:164fix_obj_pool finish:174fix_obj_pool finish:185fix_obj_pool f阅读全文
- C协程使用举例
摘要: 本篇使用上一篇提供的接口,实现一个简单的协程调度框架.基本思想是,创建一个调度器,用于将处于活动状态的协程调度运行,调度器维护着一个actived列表,调用spawn创建协程时,将新建立的协程添加到活动列表中。调用schedule将启动调度器主循环.coro.h#ifndef _CORO_H#define _CORO_H#include <stdint.h>#include "uthread.h"struct coro{ struct coro *next; uthread_t ut; uint32_t id; start_fun st_fun; uint32_阅读全文
- 实现c协程
摘要: 协程的概念就不介绍了,不清楚的同学可以自己google,windows和unix like系统本身就提供了协程的支持,windows下叫fiber,unix like系统下叫ucontext.在这里重复制造轮子,一是为了更清楚了解协程的实现,二是为了在windows和unix like系统下都提供一套统一的协程接口.首先介绍下接口,很简单,只有几个函数:#ifndef _UTHREAD_H#define _UTHREAD_Htypedef void (*start_fun)(void *); typedef struct uthread* uthread_t;uthread_t uthread阅读全文
- C工具9:定时器
摘要: 程序项目经常用到定时功能,如网络程序中,每隔固定的时间将发送缓冲中的数据一次性发往对端.下面介绍一个用posix timerfd实现的定时器, timerfd将定时器当做一个文件描述符,当定时器到时fd变为可读,可以将这个描述符交给epoll监听,timeout的时候由epoll返回并执行回调.timer.h#ifndef _TIMER_H#define _TIMER_H#define MAX_TIMER 4096typedef struct Timer *Timer_t;typedef void (*timer_callback)(Timer_t,void*);typedef struct 阅读全文
- ucontext实现的用户级多线程框架3(实现echo服务器)
摘要: 前面一篇文章实现了一个抢先式的用户级多线程框架,现在用那个框架编写一个echo服务,因为只是个实验,所以代码写得比较杂乱,还有很多可能出错的情况也没有处理,这些在今后的进一步研究中都会慢慢修改,下面是代码:uthread.h/** brief: 用ucontext实现的用户级线程框架* author: kenny huang* date: 2009/10/13* email: huangweilook@21cn.com*/#ifndef _UTHREAD_H#define _UTHREAD_H#include <ucontext.h>#include <stdio.h>阅读全文
- ucontext实现的用户级多线程框架2(抢先式多线程)
摘要: 以前曾经写过一篇blog,使用linux ucontext实现的用户级多线程框架.那个框架实现的是协作式多线程序,也就是只有当正在执行的coroutine主动放弃处理器时,其它coroutine才有机会得以执行.今天用ucontext实现了一个抢先式的用户级多线程框架,其主要思想是,用一个物理线程作为中断发生器,以固定的时间间隔发送SIGUSR1信号.另一个物理线程运行Scheduler和用户级线程。每当这个物理线程收到信号的时候,就会将执行权切换到Scheduler,由Scheduler挑选一个个用户线程执行.thread.h// C/C++ header file// Author: ..阅读全文
- ucontext实现的用户级多线程框架
摘要: 昨天看CN-Erlounge-IV讲搞的其中一篇<erlang进程模型在C++中的实践>,对用coroutine实现用户态的线程非常感兴趣,于是查下资料写了个简单的实验框架,其中schedule算法的实现很简单,只是遍历所有可以执行的coroutine.代码如下:uthread.h/** brief: 用ucontext实现的用户级线程框架* author: kenny huang* date: 2009/10/13* email: huangweilook@21cn.com*/#ifndef _UTHREAD_H#define _UTHREAD_H#include <uco阅读全文
- 死锁检测
摘要: 曾经参与过的一款网络游戏,其服务器使用了异常复杂的多线程序解决方案。导致应用层程序员编写的代码很容易就出现死锁。最终,公司的一个老员工,只能开发了一个死锁检测框架,在debug模式下运行时,只要发生死锁就会打印出调用堆栈。虽然说这个框架基本可以在上线前把所有的死锁都检测了出来,但是,规根到底这是设计不合理造成的,多线程利用好了会提升应用的效率,用不好的话,除了影响效率外,对上层开发简直是灾难。下面说说那个检测方法,其实方法挺简单的。有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。每次加锁之前都会做如下检测:1)检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些阅读全文
- 利用用户级线程提高多线程应用的性能
摘要: 随着处理器往多核的发展,多线程被越来越多的应用到软件的开发中。但是如果没有正确的使用多线程,反而可能会导致软件性能的下降。多线程程序中一个影响程序性能的因素就是同步。对于windows系统来说,最快的同步方案就是critical_section,critical_section基本上可以被认为是一个用户态的同步机制(特别是设定了spincount,只有在自旋超过了spincount次之后任然不能获得锁,才会切入核心态并把当前线程阻塞).但即使是这样,如果在临界区中的代码如果处理时间比较长,任然会导致处理器浪费在自旋上。如果我们可以让线程在无法获得锁的时候就切换线程(当然是在用户态,切换核心态线阅读全文
- C 工具库8:map
摘要: 本篇介绍另外一个在C++ stl中常用的容器map.我打算将map的实现容器和map接口分开,创建map的时候可以传递一个实现了interface_map_container接口的对象指针进来,如果这个参数传0,则默认使用红黑树做实际的容器.这样做的好处是用户可以根据性能需求传递自己定制的容器类.例如在游戏程序中常见的数据表.一般通过一个索引查询,并且在程序启动时候将数据全部加载好,在以后的运行中,只会对数据进行查询,不会做任何修改的动作.在这种情况下,使用一个数组存放key,val对,再加载完成后对数组排序,后面查询的时候使用2分法,显然比用红黑树或其它的二叉平衡树效率更高.好了,下面介绍m阅读全文
- C 工具库7:local_pool
摘要: 这是我的工具库中最后一个内存分配相关工具,其主要用途是,在某一函数或一个作用域中需要使用动态内存,出了这个作用域之后,马上就释放这些分配的内存.其主要工作模式是,函数开始时分配一大块内存,由分配器管理,函数中需要使用的动态内存全都由分配器从这块大的内存中分配出来,分配出来的内存无需free,函数返回之前销毁分配器,由分配将开始分配的大块内存释放.local_pool.h#ifndef _LOCAL_POOL_H#define _LOCAL_POOL_Htypedef local_pool *local_pool_t;/** pool:外部传进来的大内存块首地址,当这个参数不为0时,* ...阅读全文
- C 工具库6:通用内存分配器
摘要: 本篇将介绍一个通用内存分配器的实现.上一篇的开头已经介绍过,这个实现是组合first fit pool和fix_obj_pool以处理不同大小的分配请求.首先看由fix_obj_pool返回的内存的头结构:struct head_fix{unsigned short idx;/*0-255,表示在fix_objs的下标*/unsigned short chunk_idx;};这个头不会返回给上层应用,是给释放内存使用的.因为内存的请求是对齐到4字节的,小于1024字节的请求,被分成256个分配大小,分别是4,8,12,....1024.每个大小的请求由一个fix_obj_pool处理.idx的阅读全文
- C 工具库5:first fit pool
摘要: 本篇介绍通用内存分配工具的另一个组件,first fit momery pool,也就是首次适应内存分配器。相对于best fit 算法,通常来说first fit具有更好的平均性能,具体分析可参考kunth计算机程序设计第一卷2.5的讨论.我的通用内存分配器准备组合使用fix obj pool和first fit pool.fix obj pool用于处理1-1024字节的小内存请求.这里分配的内存是对齐到4字节的.而对于1-1024字节以外的大内存块请求,将交给first fit pool处理.为了加快free时的处理效率,将对fix obj pool做一个小处理,具体将在下篇通用内存分配阅读全文
- C 工具库4:变长数组(vector)
摘要: vector.h#ifndef _VECTOR_H#define _VECTOR_Hstruct vector;struct vector *vector_create(unsigned int val_size,unsigned int reserve_size);struct vector *vector_copy_create(struct vector*);void vector_copy(struct vector*,struct vector*);void vector_reserve(struct vector*,unsigned int);void vector_destroy阅读全文
- C 工具库3:固定大小的 obj pool
摘要: 对大小固定的对象提供的对象池工具,当对内存分配的请求大小不固定时,使用其它的通用内存池.fix_obj_pool.h#ifndef _FIX_OBJ_POOL_H#define _FIX_OBJ_POOL_Hstruct fix_obj_pool;/** obj_size:对象大小* default_size:默认对象池大小* align4:返回的对象地址是否需要对齐到4字节*/extern struct fix_obj_pool *create_pool(unsigned int obj_size,int default_size,int align4);extern void destro阅读全文
- C 工具库2:异常处理
摘要: 使用setjmp,longjmp实现的C与言异常处理框架。提供 抛出异常,捕获异常等功能。exception.h#ifndef _EXCEPTION_H#define _EXCEPTION_H#define except_alloc_failed 1 //内存分配失败#define except_list_empty 2 //list_pop操作,当list为空触发//............#endifexcept.h#ifndef _EXCEPT_H#define _EXCEPT_H#include <setjmp.h>#include <stdio.h>#incl阅读全文
- C 工具库1:list
摘要: 近来考虑将项目基础框架的开发语言从C++换成C,免不了要编写一大堆的基础工具。本篇为第一篇,list,提供的接口和操作方式与std::list相似.后续将会陆续贴出map,vector,memory pool,hash_table等工具。list.h#ifndef _LIST_H#define _LIST_Hstruct list;struct node;struct fix_obj_pool;struct list_iter{ struct node **next; struct node *n;};struct fix_obj_pool *list_create_obj_poo...阅读全文
- C++反射实现
摘要: C++实现反射的一个简单实验,考虑并不充分。typelist.h#ifndef _TYPELIST_H#define _TYPELIST_Hclass NullType {};//Typelisttemplate <class T, class U>struct Typelist{ typedef T Head; typedef U Tail;};template <class TList, class T> struct IndexOf; template <class T>struct IndexOf<NullType, T>{ enum {阅读全文
- 消息队列的设计
摘要: 在网络服务器的设计中,经常使用多进程/多线程.这就涉及到在进程/线程间共享数据.现在我们假设一个场景,一个进程/线程负责处理网络收发,一个或多个进程/线程处理收到的网络数据包.显然,我们可以在每一对协作进程/线程间添加一个队列,将数据添加到队列中,以实现两个进程/线程的协作.我们的消息队列主要的设计目标有三个:1)要可以使用在进程与进程和线程与线程之间.当在进程之间通信时,我们的消息队列将会被放在共享内存中.2)避免使用锁机制,其一方面原因是锁的开销较大,另一方面是因为,对于在共享内存中使用消息队列时.如果一个进程获得锁之后崩溃,另一个进程将得不到任何的通知.当它要获得锁的时候,将会阻塞在永远阅读全文
m2014_c->c语言容器类工具列的更多相关文章
- atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质 #---语言的 工具和材料双重性 有的人说语言是个工具,有的人说语言是个材料..实际上语言同时属于两个属性. ...
- LInux系统的C语言开发工具笔记
常用的C语言开发工具有很多,每个开发工具所支持的库函数和对标准的实现都有差异.对于初学者,选择一款使用广泛.上手容易的开发工具才是王道.在Windows 上很多从事C和C++开发的人员都选择VS作为开 ...
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- 求推荐go语言开发工具及go语言应该以哪种目录结构组织代码?
go语言的开发工具推荐? go语言开发普通程序及开发web程序的时候,应该以哪种目录结构组织代码? 求推荐go语言开发工具及go语言应该以哪种目录结构组织代码? >> golang这个答案 ...
- Pandoc —— 标记语言转换工具(中文乱码问题)
今次毕业设计,来个逼格高的,用 latex 编写.谁曾想,学院首先要收一份 word 版的.辣么多的 latex 公式如何转呀. Pandoc 是由 John MacFarlane 开发的标记语言转换 ...
- Go 语言开发工具
Go 语言开发工具 LiteIDE LiteIDE是一款开源.跨平台的轻量级Go语言集成开发环境(IDE). 支持的操作系统 Windows x86 (32-bit or 64-bit) Linux ...
- C语言开发工具
1.编写程序的工具: indent命令将自动调整C代码的缩进风格,个人比较喜欢indent -kr 2.编译C语言程序: 1.gcc编译器: gcc是一个ANSI C兼容编译器,C++编译器也可以编译 ...
- language-detection 语言检测工具 java版的应用demo
本文基本借鉴大佬文章:http://www.cnblogs.com/makemelaugh/archive/2012/09/26/2704802.html 在此基础上添加一些自己的补充,方便查阅. 提 ...
- c/c++语言开发工具Dev-cpp【推荐】
Dev-cpp: 工具介绍:https://baike.baidu.com/item/dev%20cpp/5617687?fr=aladdin 百度云下载地址:链接: https://pan.baid ...
随机推荐
- eclipse项目引用项目方法
在Java Build Path中将被引用项目Add加入到引用项目中. 在Deployment Assembly中将被引入项目Add加到配置项中. 这样在项目发布到tomcat中时被引入项目会被打成j ...
- BZOJ 1603 [Usaco2008 Oct]打谷机 dfs
题意:id=1603">链接 方法:暴力 解析: 搜1到n路径上的边权异或和-. 这几个水题刷的我有点-.. 代码: #include <cstdio> #include ...
- Python title() 方法
描述 Python title() 方法返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写. 语法 title() 方法语法: S.title() 参数 无. ...
- js获取当前域名的方法
一.获取当前域名 1.方法一 var domain = document.domain; 2.方法二 var domain = window.location.host; 但是获取到的domain在线 ...
- QT实现右键快捷菜单
[转自]:http://blog.csdn.net/rolland1989/article/details/5754575 QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单 ...
- asp.net mvc部署iis常见问题
1.Q:iis比网上的少很多选项 A:iis没装全,去控制面板里把没勾选的选项勾选 2.Q:发布mvc遇到的HTTP错误 403.14-Forbidden解决办法 A:需要在web.config里添加 ...
- Makefile 8——使用依赖关系文件
Makefile中存在一个include指令,它的作用如同C语言中的#include预处理指令.在Makefile中,可以通过include指令将自动生成的依赖关系文件包含进来,从而使得依赖关系文件中 ...
- 彻底征服 Spring AOP 之 理论篇
基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...
- node js 调试出现同一个端口启动多次报错处理方案 Error: listen EADDRINUSE
windows 下 1.查询端口占用的进程ID: netstat -aon | findstr "80" 80为端口号, 输出为: TCP 0.0.0.0:3000 ...
- java strtus2 拦截器(Interceptors)
在strtus2 中有一个比较重要的东西就是拦截器(Interceptors) 拦截器可以做到在已有的业务中插入一块共通的,比如在一个业务中,直接插入一串登录功能,就不用去每个页面一个个去显示是否登录 ...