随笔分类 -  基础/C++/算法

STL不方便的细节总结
摘要:1. 默认的allocator 默认的allocator是std::allocator,只是简单的new delete的封装,会导致内存频繁地申请和释放,使用者要传一个更好的 allocator进去。2. 循环过程中不好直接删除任意节点 举个最简单的例子 某个基础模块: struct Handler { virtual void Handle() = 0; }; class HandlerMgr { public: void Run() { for (size_t i = 0; i < .....) { m_handlers[i]->Handle(); } } ... 阅读全文

posted @ 2012-11-01 11:31 daemonh 阅读(217) 评论(0) 推荐(0)

记录一下linux errno的定义位置
摘要:每次都得找一下,记录一下vi /usr/include/asm-generic/errno.hvi /usr/include/asm-generic/errno-base.h 阅读全文

posted @ 2012-10-20 10:24 daemonh 阅读(270) 评论(0) 推荐(0)

protobuf用Extensions定义消息方法
摘要:protobuf Extensions这个东西还真蛮有用的, 这里记录一下用Extensions定义方法。msg.protopackage ProtoCS; enum CmdID { CID_MOD = 1, } message MsgHead { optional int32 cid = 1; } message Msg { optional MsgHead head = 1; optional int32 ret = 2; extensions 100 to 10000; } 这是主文件,注意看最后一行, 留了100~10000的tag numbe... 阅读全文

posted @ 2012-08-08 15:20 daemonh 阅读(1246) 评论(0) 推荐(0)

C++运算符优先级,记录一下
摘要:C++ 运算符优先级列表http://www.cppreference.com/operator_precedence.htmlPrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operatorPost-incrementPost-decrement(a + b) / 4;array[4] = 2;ptr->age = 34 阅读全文

posted @ 2012-08-05 13:35 daemonh 阅读(186) 评论(0) 推荐(0)

32bit g++编译64位整数作为key的__gnu_cxx::hash_map的编译错误问题
摘要:类似这样一段代码:__gnu_cxx::hash_map<uint64_t, Obj> objs;64bits的整数作为key的__gnu_cxx::hash_map, 原来一直在64bits的编译器下编译,一直好好的。有一次放到32bits的编译器下,产生一大堆乱七八糟的错误(模板编译错误提示太坑爹了)。问题出现在template<class _Key> struct hash{} 里面。struct __gnu_cxx::hash{}偏特化了几种整数版本,包括char, short, int, long,以及上面4种unsigned版本,分析unsigned lon 阅读全文

posted @ 2012-07-21 18:14 daemonh 阅读(251) 评论(0) 推荐(0)

从 Memcached 分布式应用看一致性哈希散列函数的选择 .
摘要:一致性哈希算法来源于 P2P 网络的路由算法,目前主流的 P2P 软件就是利用我们所熟知的 DHT (Distributed Hash Table,分布式哈希表) 来定位整个分布式网络的信息,另外此算法在目前火热的云计算领域也将占有极其重要的位置。可以说散列函数在当代计算机和网络系统中所起的重要作用大家应该都有目共睹了,特别是在目前这个分布式应用爆炸的时代,这个方面的知识只会越来越引起人们的重视,本文重在从 Memcached 这个流行的分布式应用的场景中来对一致性哈希散列的几个主流算法做一些比较和分析。[背景信息] 对于 Memcached 来说,本身是集中式的缓存系统,要搞多节点分布,只能 阅读全文

posted @ 2012-07-09 15:37 daemonh 阅读(192) 评论(0) 推荐(0)

更快、更强 64位编程的三十二条军规
摘要:http://www.cnblogs.com/niocai/archive/2011/11/09/2242565.html即使目前没有为纳米电子学、空气动力学、分子静力学、细胞生命周期建模等等编写高级应用程序,说不定以下这32条规则,对你向更高级处理器移植程序会有所帮助。 近期以来,似乎大家都在谈及64位计算,如采用AMD Athlon 64处理器的笔记本、采用IBM PowerPC 970芯片的Apple G5、又或Intel Itanium架构是否会被取消,对此,IT界和新闻界似乎都还没有尽兴。新一轮处理器所带来的冲击,不仅表现在改善数据库执行效率、提高图形程序速度上,也为编写解决世界上. 阅读全文

posted @ 2012-06-12 15:38 daemonh 阅读(150) 评论(0) 推荐(0)

遇到的一个bug
摘要:大体代码是这样:class Role;void GameMgr::Handle(){ DispParam dp; Role* role = GetRole(xxx); if (!role) { role = CreateRole(...); dp.role = role; } Dispatch(...);} 上面dp的role,如果role是合法的时候,就不会去设置正确的role。然后经过X层调用后,最后dp.role->Set(xxxxx);void ... 阅读全文

posted @ 2012-05-31 19:47 daemonh 阅读(144) 评论(0) 推荐(0)

多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 Options
摘要:多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间陈硕Blog.csdn.net/Solstice自从 Intel Pentium 加入 RDTSC 指令以来,这条指令是 micro-benchmarking 的利器,可以以极小的代价获得高精度的 CPU 时钟周期数(Time Stamp Counter),不少介绍优化的文章[1]和书籍用它来比较两段代码的快慢。甚至有的代码用 RDTSC 指令来计时,以替换 gettimeofday() 之类的系统调用。在多核时代,RDTSC 指令的准确度大大削弱了,原因有三: 1.. 不能保证同一块主板上每个核的 TSC 是同步的; 2.. C 阅读全文

posted @ 2012-03-19 11:07 daemonh 阅读(479) 评论(0) 推荐(0)

C++ new/operator new/placement new的区别
摘要:new C++语言内置的运算符,分配指定对象类型的内存空间,再调用构造函数。::operator new new的重载运算符,就是分配一片原始的内存空间,调用者要指定内存大小。从功能上等同于C的malloc()?(我不完全确定)placement new 把某个对象放到已经存在的内存空间中。下面看实际例子struct Hello { Hello() { } ~Hello() { } private: int a; }; int main(int argc, char* argv[]) { Hello* hello = new Hello; delete hell... 阅读全文

posted @ 2012-03-12 13:57 daemonh 阅读(206) 评论(0) 推荐(0)

一种LFU淘汰算法
摘要:以前介绍过LRU高效的实现方式:一种O1性能的LRU算法 http://blog.csdn.net/herm_lib/article/details/6535698今天也介绍一下LFU的实现方法。LRU是最近最少使用算法,就是把最早才访问的数据淘汰掉。LFU是最近最不常用算法,就是某一段时间内被用到最少的淘汰掉。LFU时间周期 使用次数的时间长度,这个时间不能太短,短了体现不出哪些数据是热点;同样也不能太长,太长的话,某一个时间点的对某个数据的访问峰值可以长期影响我们的淘汰策略。一般实现的算法可以根据业务特点去调节这个参数。上个周期访问次数权重 在本周期开始的时候,最粗暴的做法是把所有数据的访 阅读全文

posted @ 2012-03-01 19:56 daemonh 阅读(543) 评论(0) 推荐(0)

记录一下 __gnu_cxx::hash_map传一个新allocator的写法
摘要:老得查代码写,这里记录一下:hash_map(size_type __n, const hasher& __hf, const key_equal& __eql, const allocator_type& __a = allocator_type()) // 全局的角色指针Allocator __gnu_cxx::__pool_alloc<Role*> g_rolePtrAlloc; typedef __gnu_cxx::hash_map< uint32_t, Role*, __gnu_cxx::hash<uint32_t>, ... 阅读全文

posted @ 2012-02-23 16:30 daemonh 阅读(354) 评论(0) 推荐(0)

内存碎片和memcached slab控制碎片方法
摘要:转自:http://blog.csdn.net/xuzhonghai/article/details/7285821内存碎片的产生:内存分配有静态分配和动态分配两种 静态分配在程序编译链接时分配的大小和使用寿命就已经确定,而应用上要求操作系统可以提供给进程运行时申请和释放任意大小内存的功能,这就是内存的动态分配。 因此动态分配将不可避免会产生内存碎片的问题,那么什么是内存碎片?内存碎片即“碎片的内存”描述一个系统中所有不可用的空闲内存,这些碎片之所以不能被使用,是因为负责动态分配内存的分配算法使得这些空闲的内存无法使用,这一问题的发生,原因在于这些空闲内存以小且不连续方式出现在不同的位置。因此 阅读全文

posted @ 2012-02-23 10:04 daemonh 阅读(301) 评论(0) 推荐(0)

作为局部变量的std::string和标准库容器一种内存优化方法
摘要:实际项目中,往往看到好多项目把std::string, std::vector作为局部变量直接使用的情况。 类似下面std::string的用法:void SomeClass::Fun() { std::string str = "abcd"; str += "efgh"; } 下面是std::vector的类似例子:void SomeClass::Fun2() { std::vector<int> iv; iv.push_back(22); DoFun2(iv); } ... 阅读全文

posted @ 2011-09-05 22:29 daemonh 阅读(516) 评论(0) 推荐(0)

kfifo 一读一写无锁缓冲区中的memory barrier
摘要:Linux kernel实现了一个kfifo,支持一读一写线程的无锁操作。具体代码见kernel/kfifo.c。在2.6稍高一点的版本里都会涉及到memory barrier。本文稍微解释一下memory barrier。先看一下简单的两行代码: 26 bool flag = true; 27 int tmp = 10;26,27在现代的多核处理器里执行可能是并行的,实际运行过程和表面代码有点差别。在26,27前后加上memory barrier后,生成指令能保证运行顺序和代码顺序是一样的。 阅读全文

posted @ 2011-08-20 10:15 daemonh 阅读(272) 评论(0) 推荐(0)

导航