hdqqq

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  35 随笔 :: 0 文章 :: 104 评论 :: 0 Trackbacks
共2页: 1 2 
@Chipset
麻烦看清楚文章再喷
12 行没检查返回值
53 行 new 一定成功吗
在alloc和free中看到了new和delete,这种分配不会是o(1)的。
re: 被delete难倒了[未登录] hdqqq 2011-04-01 11:32
如果楼主使用 /mt 编译,dll启动时使用自己的堆, 在主程序中new 出来的对象,再通过指针传给dll,然后在dll中释放,会产生错误,主程序和dll使用不同的堆。
* 查找光标当前单词
gd 查找光标单词定义
ga 显示光标下字母ascii码
比较讨厌这种引用计数指针的使用,一旦使用就意味这在所有的函数参数中必须使用指针引用或者值拷贝,一旦某些函数要求用裸指针,就可能引发问题。
文件映射无助于增加进程可用地址空间。除非你修改set的实现,把对节点的访问直接
对应到对文件的访问,但是在大数据量的情况下,随机访问的效率很差。

关键还是在于减少内存的使用上

1. stl 中的set使用红黑树实现的,一个节点有左,右,父节点三个指针和一个红黑标志位.32位系统下最少占用13个字节,
考虑内存对齐下,可能使用到16个字节,在大数据量的情况下,为了保持这个树结构,额外使用的内存是很多的,可以考虑使用hash set.

2. url长度都比较长,可考虑计算md5 hash,减少存储占用.

3. 不要妄想把所有数据都存在内存,总会有内存耗尽的时候,另外,如果程序异常或者崩溃,所有数据将丢失.

我以前实现的一种方式是,以数据库为主要存储,内存作为优先查询cache.
1. 数据库建散列表, 以十六进制 0-F 开始,根据md5第一位决定存储表,用于存储md5值,并对md5建索引加快查询.
2. 在内存中用set或map保存md5值,查询时先计算url md5值,再查询内存,如果不存在,则从数据库加载.如为新url,先存入内存.
3. 内存总量到一定阀值,进行数据保存,并清空内存cache.

不过这种实现存在cache命中问题,你可以一次加载整张表,也可以用 like 查询条件,减少数据库返回的记录数.

已有的php实现,内存cache200万条记录,总内存使用在1200M左右,可长时间运行,没有内存使用问题.
麒麟感觉就是参照freebsd搞的,看top的显示就知道了,可以说是一抹一样.
可能就是直接拿过来调了一下。
配置文件中增加
imap <F3> <Esc>gg=G
或者
nmap <F3> gg=G
以后一键搞定.
@hdqqq
上面已经贴了类似的,我的作废。
unsigned long val ;
int count = 0;
while(val) {
count += (val & 1) ;
val >>= 1;
}
用协议栈代码和ace代码对比欠妥,基础层要提供的接口和要实现的功能相对固定,而在应用层上,要复杂很多。
照着楼主的代码,果然有问题,麻烦楼主以后写代码或者转文章对读者负责一下,最烦这种转文章的,搞的搜索结果都一样,都是转帖的。
re: 邪恶的Windows[未登录] hdqqq 2009-07-31 17:25
你有命名MessageBox的权利,条件是别去包含 <windows.h>
既然你包含了这个文件,那就乖乖换名字吧。
涉及的东西太多了,有些还不完善,线程库在windows下只是简单的封装,连优先级调整都没有,线程局部存贮没有编译开关。
这个和include .h 文件有啥区别,后缀不同而已。
是啊,所以我让你看
typeid(std::string()).name()
的输出.
typedef void (type_func)(void);
typedef void (*ptype_func)(void);

template <typename T>
class template_class
{
private:
typedef T local_type;
public:
template_class()
{
std::cout << typeid(local_type).name() << std::endl;
}
};

void test()
{
template_class<int> la;
template_class<type_func> lg;
template_class<ptype_func> lb;
template_class<int()> le;
template_class<int(int)> lf;
template_class<int(int())> lc;
template_class<void()> ld;
}

上面的代码可编译通过
std::string() 也可以看作是一个类型.

long test(void);
sizeof(test) 和 sizeof( test() )
前面一个是 函数指针, 后面一个是 test 的返回值 long.

你可以看看这个的输出.
std::cout << typeid(std::string).name() << std::endl;
std::cout << typeid(std::string()).name() << std::endl;

在下面这句话里
boost::function<std::string()> func(Test);

这个std::string 的变量根本不会被构造, 所以不存在 所谓的实例.
re: C 还是 CPP[未登录] hdqqq 2009-04-10 18:41
@Lingol
可能我举得例子太简单了,在编译时候没开优化的情况下,是不会精简代码的.在复杂的情况下,如果 funcb被这个类的某个虚函数依赖.
如:

class CTestClass
{
public:
CTestClass(void);
~CTestClass(void);
public:
void mem_func1();
void mem_func2();
virtual void vfunc();
};


int test_function(int);

static int glob_val;

CTestClass::CTestClass(void)
{
glob_val = 10;
}

CTestClass::~CTestClass(void)
{
glob_val = 0;
}

void CTestClass::mem_func1()
{
glob_val = 1;
}

void CTestClass::mem_func2()
{
printf("hello world\n");
}

void CTestClass::vfunc()
{
mem_func1();
}


int test_function(int val)
{
int ret = val;

CTestClass lt;
lt.mem_func2();
return ret;
}
用vs2003把
上面的代码被编译成了lib,在main函数中调用
test_function(atoi(argv[1]));开启全部优化,在生成的map文件中显示

_main 00401000 f comple_test.obj
??0CTestClass@@QAE@XZ 00401020 f complie_lib:TestClass.obj
??1CTestClass@@QAE@XZ 00401040 f complie_lib:TestClass.obj
?mem_func1@CTestClass@@QAEXXZ 00401060 f complie_lib:TestClass.obj
?mem_func2@CTestClass@@QAEXXZ 00401070 f complie_lib:TestClass.obj
?vfunc@CTestClass@@UAEXXZ 00401080 f complie_lib:TestClass.obj
?test_function@@YAHH@Z 00401090 f complie_lib:TestClass.obj

可以看到,尽管只调用了构造,析构和mem_func2,mem_func1 还是连接在里面.

re: C 还是 CPP[未登录] hdqqq 2009-04-07 23:12
我说的这个程序,它的用途是和一些数据打包后,需要在客户机器上直接运行,不需要安装或依赖额外的dll,就像直接运行的电子书或者demo啥的,如果试想程序有上兆,数据才几百k是不是有点浪费,而且以后还可能制作成千上百个的文件,累计起来是很可观的,执行文件大小和效率一样重要. 另外 crt用dll的话,vc6的crt dll基本上windows系统都有,但是vc2005的crt就不是每个系统都有的,你需要另外装个vc2005 redistributable. 至于库的问题,程序的配置文件,一开始用的是一个跨平台的xml解析lib, 开始的时候运行的很好,但是当配置文件在600K以上的时候,效率惨不忍睹,后来算了,改为直接结构化读写,一样解决问题,我写这篇文章的目的,不是说啥库都不用,而是不要滥用,模版也一样,在做程序规划的时候,在写程序的时候,多用用 "奥卡姆剃刀".
re: C 还是 CPP[未登录] hdqqq 2009-04-05 19:27
效率还是很重要的,打个比方,客户要辆自行车,一个手工作坊弄了辆捷安特出来,一个号称全能的车间弄了辆28吋永久出来,你说那个更好,我写这篇文章的目的,是想说在写代码的时候,用到某项功能或者库的时候,你需要清楚地了解,你会付出哪些代价,并且权衡一下,如果没有使用的必要,就不要用.对于一个新开发的项目来说,没有对比,也许还不是很突出,但是对于已有项目来说,是一个很重要的问题.
多谢反馈意见.
这个错误是
ts.WriteLine(external.menuArguments.document.selection.createRange().text);
这句代码有问题,缺省打开的是ascii文件, 改成uncode模式打开文件就好了.
修改后的代码

<script language="javascript">
var fso,ForAppending,ts;
var t_str;
fso=new ActiveXObject("Scripting.FileSystemObject");
ForAppending = 8;
ts = fso.OpenTextFile("c:\\collect.txt",ForAppending, true, -1); //在这里是一个绝对路经,用的时候必须修改
t_str = external.menuArguments.document.selection.createRange().text;
ts.WriteLine(t_str);
ts.WriteLine("#########################");
ts.close();
</script>
任务只是抽象意义上的需要运行的代码,函数和成员函数只是对于人来说的,对于机器来说,都是一样的,至于已有函数满不满足接口我想是架构需要考虑的问题,其实一旦代码编译好了,其调用方式就定了,如果非要满足所有的调用方式,可能rpc或者com的方式更适合一些。
我以前写的关于 函数和线程方面调用的文章。

http://blog.csdn.net/hdqqq/archive/2005/06/29/407674.aspx
其实不一定要过度追求线程实现,一般的实现方式是启动几个线程提供对外服务,有任务提交后,分配运行。这样可伸缩性也比较强。
re: boost 1-35编译[未登录] hdqqq 2008-07-16 17:13
你到linux下编译一下就知道了,不带版本号的是一个链接,但是在windows下不支持,所以有两个了,用链接的好处就是可以随时升级新的版本.
c++编译的时候,对函数名进行修饰,用于实现函数充载,而c里面没有这个,所以需要用extern “C” 在对头文件进行声明的时候加以区分。这个用于链接的时候进行函数名查找。
re: 可爱的Vim[未登录] hdqqq 2008-05-26 10:56
vim 是控制台程序,所以可以远程登录后进行文件编辑,这点上windows下的编辑器根本没这个功能.

vim用熟了,鼠标根本用不着,很灵活.
@苦恼
我写的爬虫,主要的几个类都在代码里面了,你用java开发的话,关键还是找到对应的功能,象map或者hash map, http下载, 正则表达式等功能的类或者库,还有就是处理数据库的模块,应该可以实现的.
是的,那些在javascript中的url比较难用正则表达式概括出来,因为还可能是根据变量生成的,所以就直接过滤了.

至于排重的问题,因为我计算的是url的md5,而不是整个html的md5,所以在碰到页面更新而url不变的时候,会有问题.这个我在测试新浪新闻首页的时候,发现尽管新浪新闻首页的url不变,内容会变,但是具体到其中的某条新闻,都是有单独的url的.碰到这种情况,只要周期的运行一下爬虫就可以了,我现在的机器上就是用crontab 定时运行的.

这个也和爬虫的目的有关系,有的可能更关注某个具体站点,有的也许想多爬一些站点,这个是深度和广度的关系,和使用者的策略有关.

我现在用的是一张表记录历史记录,在百万数量记录下,效率不是最好的,建立更小的的分布存储表可能会更好一些. 这些可以部署架构方面进行改进.
邮件已经发了.
@TD
是的,如果开始的时候指定vector是可以的,但是限定了vector的大小。
不用vector是考虑到在大数据量的情况下,vector会进行内存的拷贝复制,所以采用了list
re: OOP的黄昏[未登录] hdqqq 2007-12-07 18:31
标题取的和内容没啥联系。看了标题跑进来,原来在将concept。
extern "C" 之后,就不能重载函数了,关键还是函数名修饰的问题.
如果隐藏私有的数据成员,会不会造成实现代码中sizeof(class) 和使用该类时sizeof(class) 大小不同, 导致数据出错.
装个beryl 弄个立体桌面,比vista 酷多了.
loki for vc6 我已经上传了,下载地址.
http://www.cppblog.com/Files/hdqqq/lokiVC6port.zip
我这里有,留个mail地址我发给你.
跨平台的数据库操作接口,比较难实现.
类似于Format的用法可以象下面这样,只是少了格式字符串
make_str("当前计数:",100,"总计数", 150);
至于效率的问题,确实是没有sprintf这种直接操作的函数快,因为涉及到返回的拷贝复制的开销和stringstream的内部实现等制约.
这些函数的目的只是为了生成字符串,至于是显示出来还是写入文件,是看需求的,功能就象cstring 的format 成员函数.
re: 数组取大小[未登录] hdqqq 2007-06-15 11:42
这个倒是没考虑过.
你可以取看看boost中的preprocessor 部分,讲的是预处理元编程,你这个宏的功能和boost 中的BOOST_PP_ENUM_PARAMS 宏功能类似.
共2页: 1 2