2007年2月25日

千万注意,不要 hack std::string

摘要: 前段时间被一个bug折磨了两个星期,最后发现竟然是如此一个陷阱——我为了减少内存用量并且减少一次内存拷贝,直接通过string.data()修改了string的内部表示。这与其说是一个陷阱,不如说是我自己给自己造了一个陷阱然后把自己给掉进去了。发病机制可以用如下代码简单的勾画出来:using namespace std;int main(int argc, char* argv[]){ string str1 = "abcde"; string str2 = str1; strcpy(const_cast(str2.data()), "1234"); c 阅读全文

posted @ 2007-02-25 14:49 能发波 阅读(137) 评论(0) 推荐(0)

2007年2月9日

前缀压缩词典

摘要: 包含多个固定索引,一个可变索引,固定索引使用一个内存池和一个数组保存项目在内存中的偏移,并且使用前缀压缩,使用空间最小(每个词条4个字节的索引空间) 可变索引不压缩,并且可以动态插入词条,占用空间较大(每个词条20个字节的索引空间)存储 1000 万个词,占用内存 100M 左右,平均每个词10个字节(包括了字符串空间和索引空间)。接口采用 stl 容器的风格 阅读全文

posted @ 2007-02-09 22:34 能发波 阅读(167) 评论(0) 推荐(0)

cpu 的 cache 是很宝贵的——从互相平行的数组看

摘要: 以前一直想不通,为什么在有些系统中,要把同一个数据结构的不同字段放入多个互相平行的数组中,而不是放入一个结构中。典型的如Windows PE 可执行文件的导入表,有 IAT (导入地址表)和 INT(导入名字表),这两个表就放在两个互相平行的数组中,而按照我们的第一感觉,好像这样的设计纯粹是玩弄我们的大脑,没有任何别的益处。其实仔细想想,这样的益处是很大的,在Windows 从 INT 载入 IAT 以后,INT 就几乎永远用不着了,而 IAT 使用得非常频繁,这样,CPU 就会把 IAT 载入 cache,如果把 INT 和 IAT 分离(两个平行的数组),CPU 载入 IAT 时就不会连 阅读全文

posted @ 2007-02-09 22:25 能发波 阅读(151) 评论(0) 推荐(0)

2007年1月29日

未来的 PC 会怎样

摘要: 是更简化,还是更复杂?我觉得应该是更简化。网络速度变得越来越快,终究有一天,会光纤入户,最终,或许用不了多久,网络速度已经比我们的硬盘快了。目前的PC(个人电脑)之所以是现在这个样子,是因为我们的硬盘,相对于网络有两个优势,一个是速度,一个是隐私。当速度已经不是问题,就只剩一个隐私了。而隐私问题实际上只是一个心理问题,人们总觉得把隐私敏感的东西也存储到网上不安全,容易泄露,而实际上,保存在自己的硬盘上并不比存在网络上更安全,更不容易泄露。如果大家都认识到这个问题,那么,硬盘,对于PC,就已经不重要了。(——除非此时硬盘已被如Flash一类的新产品代替了,并且速度比网络至少快一个数量级,并且大家 阅读全文

posted @ 2007-01-29 16:42 能发波 阅读(125) 评论(0) 推荐(0)

2006年12月9日

用C++的高级模版特性实现一个不需要IDL的RPC

摘要: 目前已经全部完成,并且取得了非常好的效果。使用该RPC的简短代码:rpc函数的返回值是 rpc_ret_t,主要是为了避免专门为void返回值的函数编写特化代码//////////////////////////////////////////////////////////////////////////// sample usage...// test.h typedef std::vector vint_vec;class AsyncInterface : public GlobaleScope{public: BEGIN_RPC_ADD_MF(AsyncInterface) RPC_. 阅读全文

posted @ 2006-12-09 00:24 能发波 阅读(118) 评论(0) 推荐(0)

2006年11月21日

VC++ 6.0 的函数模版解析 bug

摘要: struct TTT1 { int x; };struct TTT2 { int x; };templatevoid foo(T1& t1, T2& t2){printf("111111111111/n");}templatevoid foo(T1& t1, TTT2& t2){printf("222222222222/n");}void foo2(){TTT1 x;TTT2 y;foo(x, y);}上述代码在 vc6 中编译会出错:error C2667: 'foo' : none of 2 overl 阅读全文

posted @ 2006-11-21 17:51 能发波 阅读(136) 评论(0) 推荐(0)

2006年3月5日

按序号索引二叉树的应用

摘要: 主要是快速计数。可以从Index得到相应结点,也就可以从相应结点得到 Index。如果有两个结点,通过彼此间的 Index 相减,就可以得到他们之间的结点个数。这种算法可以推广到使用 B+Tree 或其它更复杂的树。 阅读全文

posted @ 2006-03-05 20:30 能发波 阅读(130) 评论(0) 推荐(0)

2005年12月2日

使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用

摘要: // 使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用。#include #include /* 病毒或许可以使用这种技术有效地实现,不过这是我在写 Windows PE 文件 加壳程序的时候总结出来的技术。当然可以被用在恶意程序上,任何事情总有两面性! ***注意*** 在 VC 中测试时,必须去掉“启用增量连接”,即(/INCREMENTAL:NO) 如果在 ShellCode 或者 Virus 中使用该技术,字符串文字量(string literal) 也必须进行地址转化,即:convert_address(" 阅读全文

posted @ 2005-12-02 23:01 能发波 阅读(129) 评论(0) 推荐(0)

2005年11月25日

使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数

摘要: // 使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数。#include "stdafx.h"/* 使用 "参数化基类 "和 "成员函数指针 "模拟实现虚函数。 可能大家都以为只有疯子才会这么干,好好的虚函数干吗不用,而偏要拐弯抹角地 搞得这么复杂,但有时候这可能是最好地选择。举个例子吧,我写 Windows PE 文件 加壳程序的时候,遇到一个问题: 1. 我开发了一个框架,可以只用 C++ 来写 "壳程序 ",大家很难想到吧! 2. 但不能使用一些 C++ 功能 阅读全文

posted @ 2005-11-25 19:22 能发波 阅读(186) 评论(0) 推荐(0)

2005年11月9日

stl::set 的一个缺陷

摘要: stl::set 的一个缺陷什么都好,就一点不好:不能仅仅通过 key去查找元素。如 :#include struct my_struct{ int key; int value1; int value2;//……..…. //…… explicit my_struct(int key_) // explicit 禁止将 int 悄悄转化为 my_struct : key( key_) { //.... } struct compare { bool operator()(const my_struct& l, const my_struct& r) const { retur 阅读全文

posted @ 2005-11-09 23:09 能发波 阅读(145) 评论(0) 推荐(0)

导航