2008年4月22日

C++ 的缺点

摘要: C++ 现在最时髦的用法是 template meta programming。booster 们对此非常津津乐道,我本人也是个狂热的booster。到了什么程度?不使用template 就浑身不舒服,不boost一下就感觉对不起C++。但是这种狂热带来的严重后果就是程序编译速度极慢无比,生成的执行程序尺寸超常。曾经一个 C++ 服务器程序,代码也就10000行左右,编译出来的执行程序竟然20M!编译时间半小时!写的时候感觉不到用了多少template,但是写出来竟然得到这样的结果,不得不让人吃惊!记得在大学的时候(2000年前后),初学习 template 时,感觉template之间的耦合 阅读全文

posted @ 2008-04-22 16:12 能发波 阅读(303) 评论(0) 推荐(0)

通用的 LoserTree

摘要: - 共有 n 个内部结点,n 个外部结点- winner 只用于初始化时计算败者树,算完后即丢弃- winner/loser 的第 0 个单元都不是内部结点,不属于树中的一员- winner 的第 0 个单元未用- m_tree 的第 0 个单元用于保存最终的赢者, 其它单元保存败者- 该初始化需要的 n-1 次比较,总的时间复杂度是 O(n)- 严蔚敏&吴伟民 的 LoserTree 初始化复杂度是 O(n*log(n)),并且还需要一个 min_key, 但是他们的初始化不需要额外的 winner 数组- 并且,这个实现比 严蔚敏&吴伟民 的 LoserTree 初始化更强 阅读全文

posted @ 2008-04-22 15:14 能发波 阅读(156) 评论(0) 推荐(0)

一个很强大的Comparator生成器

摘要: /** @brief 生成一个比较器(Comparator),兼键提取(KeyExtractor)类 使用这个宏生成的比较器可以作用在不同的对象上,只要这些对象有相同名称的成员, 并且可以作用在类型为成员类型的对象上。 - 假设: - 有 n 个类 class[1], class[2], ... class[n],都有类型为 MemberType ,名称为 MemberName 的数据成员 - 那么以下类型的对象可以使用该类相互比较,并且可以从这些对象中提取出 MemberType 类型的键: class[1] ... class[n], MemberType... 阅读全文

posted @ 2008-04-22 15:02 能发波 阅读(168) 评论(0) 推荐(0)

Comparator 将 M×N 转化成 M+N

摘要: 用C++写程序经常需要写一些很小的functor,最常见的例子就是 compare functor,排序的,查找的,自己每定义一个数据结构,就要定义一个 compare functor,甚至多个(对不同字段)。甚至,针对指针的,智能指针的……的compare,这件工作很繁琐,很容易使人厌倦。举个例子,同一个数据结构有M个字段,这些字段有P种类型,还有有N种不同的访问方式(直接提取、通过指针、通过智能指针、甚至通过反序列化等等),要实现所有这些情况的查找/排序,就需要 M×N 个 compare functor 的定义!从 boost::multi_index 中学到一点,将 KeyE 阅读全文

posted @ 2008-04-22 14:54 能发波 阅读(176) 评论(0) 推荐(0)

C++ 中 Bool functor 的优化

摘要: 原以为足够现代的编译器的优化能力很强,看来我是高估了。GCC 没测过,VC 2008 刚刚被证实了。 pair x(rand(), rand()), y(rand(), rand()); for (int i = 0; i inlinebool operator& _Left,const pair& _Right){ // test if _Left < _Right for pairs return (_Left.first < _Right.first || !(_Right.first < _Left.first) && _Left.se 阅读全文

posted @ 2008-04-22 13:53 能发波 阅读(104) 评论(0) 推荐(0)

2008年2月23日

住院归来

摘要: 经常坐着的同行请注意了,千万不能一下子坐得太久,我这病跟老坐着关系很大。这病叫做“肛周脓肿”,屁股上,很深的地方,出了脓肿,脓没地方排放,于是就肿大,刚开始很疼,我还以为是那次屁股撞了墙把股骨头撞坏了……,总之,费了很大周折,去医院做了手术,住了20多天的院。肛门边上被开了一个口子,很疼,很麻烦,……据医院的保守劝告,3~6个月不可久坐、久行、久立,不可骑自行车…… 阅读全文

posted @ 2008-02-23 15:27 能发波 阅读(86) 评论(0) 推荐(0)

2008年1月12日

数据库集合查询的优化

摘要: 有一个应用,需要经常做类似这样的查询 select* fromSomeTable where key in (KeySet),其中 KeySet 可能很大,比如包含几百甚至几千个元素。理想中的情况,数据库应该先在 BTree 中查找到 KeySet 中的 Key 所在的物理页面地址,然后再对这物理地址排序,最后按顺序读入这些页面内容并填充结果。如果这样做,那么在最坏情况下,KeySet 中元素的逻辑排序完全不等于其物理顺序,并且,每个Key所在的页面还不在相同的磁盘柱面上,这样,查询集合中所有 key 所花的磁盘时间就等于 Key 的数目乘以磁盘的“平均潜伏时间”(Average Latenc 阅读全文

posted @ 2008-01-12 22:21 能发波 阅读(165) 评论(0) 推荐(0)

2007年12月7日

munmap 注意事项

摘要: linux/unix 下,或者说posix 的munmap,很简单,只有两个参数:int munmap(void *start, size_t length);其中 length 必须是 mmap 时的 length,如果小于当初 mmap 时的那个length,并且正好少的部分跨越了一个page,那就麻烦了,我就犯了这个错误,非常严重的后果!内存泄漏,不是泄露了刚好少 unmap 的那个 page,而是整个 [start, length) 区域都不会成功被 unmap,也许内存中的更改已经写入文件,但是虚拟内存空间[start,length)未被释放!如此多次,会造成 ENOMEM!感谢上帝 阅读全文

posted @ 2007-12-07 16:51 能发波 阅读(186) 评论(0) 推荐(0)

2007年8月19日

腾讯 QQ 真的不是一般的烂!

摘要: qq 目录下有几个微软的动态库(见图):如果删掉,按照常规,会加载系统最新的库,但是,当我把这几个文件中的任意一个删除的时候,qq 都无法正常运行。做软件做到这个份上,不如去死了算了! 阅读全文

posted @ 2007-08-19 16:23 能发波 阅读(155) 评论(0) 推荐(0)

2007年4月5日

gcc 一个恶心的 bug

摘要: 我的测试项目下面有 4 个 .cpp 文件,测试我写的模版(在另一些 .h中)。测试的编译选项主要是 -g3 -O0 ,无优化当我改变了模版头文件,因为用到的测试代码在 main.cpp 中(包含了模版头文件),我把 main.o 删掉,重新编译,结果模版头文件的修改就是不能生效,跟没改一样,搞了很多次,都是不对,我一直以为是自己的代码有问题。在我快要疯掉时,我 make clean 所有 .o 删掉,再编译,竟然好了!我操!我又没有使用预编译头,所有测试代码都在 main.cpp 中,它竟然把 main.cpp 代码编译到了其它 .o 中! 阅读全文

posted @ 2007-04-05 18:57 能发波 阅读(171) 评论(0) 推荐(0)

导航