我自闲庭信步,悠然自得,不亦乐乎.

                                       ------ Keep life simple
GMail/GTalk/MSN:huyi.zg@gmail.com

 

2006.03.05夜

一个周末过完了。
今天晚上脑子比较清醒,想清楚了tim中好几个问题。
同时也想TT了,一转眼,四个月没见面了吧,仿佛昨天还在一起吃米线,还在一起上图书馆,还在寒冷的夜里出去买柚子,病了还有人照顾我,一切都是历历在目,不过再一算,已经一年多了吧。
TT老婆,我会一辈子爱护你,关心你,照顾你。今天晚上也和朋友提起,我告诉他我其实没什么理想,只要能幸福的和TT生活在一起,就足够了,应该说,这才是我真正的理想。
有幸福的家,一定会有成功的事业。
o_复件 009.JPG

posted @ 2006-03-05 22:55 HuYi 阅读(188) | 评论 (0)编辑 收藏

TIM中c2s的事件反应模型

     摘要: 为了更容易理解后面的内容,先给出登录jabber服务器的交互包。 登录的xml片断Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1C:  2<?xml version="1.0"?>...  阅读全文

posted @ 2006-03-03 13:40 HuYi 阅读(471) | 评论 (0)编辑 收藏

大写字符串快速转换成小写的函数

 1/* 32-bit, little-endian. suif.liyuan */
 2
 3int zbyter(unsigned int x)
 4
 5{
 6
 7     unsigned int y;
 8
 9     y = (x & 0x7F7F7F7F+ 0x7F7F7F7F;
10
11     y = ~(y | x | 0x7F7F7F7F);
12
13     if (y == 0)
14
15          return 4;
16
17     else if (y & 0x0000FFFF)
18
19          return ((y >> 7& 1^ 1;
20
21     else
22
23          return ((y >> 23& 1^ 3;
24
25 }

26
27 int UptoLow(char* pszString)
28
29{
30
31     char* pByte = 0;
32
33     int* pn4byte = 0;
34
35     int zPos;
36
37     pn4byte = (int*)pszString;
38
39     while (true)
40
41     {
42
43         zPos = zbyter(*pn4byte);
44
45         if (4 != zPos) break;
46
47         *pn4byte++ |= 0x20202020;
48
49     }

50
51     pByte = (char*)pn4byte;
52
53     for (int i = 0; i < zPos; ++i)
54
55         *pByte++ |= 0x20;
56
57     return 1;
58
59}
 
似乎很高效的样子:)

posted @ 2006-03-03 13:01 HuYi 阅读(1000) | 评论 (0)编辑 收藏

有新的支持asp.net的http和ftp空间了!

   其实四川电信的吴先生早就为我们提供了服务器,不过无奈网通电信本是冤家,自古就有“南电信北网通”的说法,我这里访问吴先生提供的服务器,速度非常的慢。所以利用率一直不高。

这里感谢神州通讯的林先生,又为我们提供了服务器和二级域名(huyi.newxz.com),这个空间主要用于存放和TIM项目相关的东西。

世界上可爱的人真多

posted @ 2006-03-03 12:56 HuYi 阅读(280) | 评论 (0)编辑 收藏

阶段式服务器模型(SEDA)

SEDA似乎是近期大家比较关心的一个话题。

http://groups.google.com/group/dev4server/browse_thread/thread/3abd7fddba2401ea/8b9e21b7ce827430#8b9e21b7ce827430

posted @ 2006-03-03 12:00 HuYi 阅读(685) | 评论 (0)编辑 收藏

STL中string的初始化问题

在邮件列表中有朋友提出:

1//我希望把string赋值10,然后显示
2string Buffer;
3sprintf( Buffer.begin(),"%d",10);
4MessageBox(NULL,Buffer.begin(),NULL,MB_OK);

建个程序,编译它,是通不过的。原因是Buffer没有初值,调用Buffer.begin()返回是NULL,第三句用MessageBox弹出一个NULL的字符串,这是不可取的。

1//改正后的程序
2string Buffer = "a"//我随便给了个初值
3sprintf( Buffer.begin(),"%d",10);
4MessageBox(NULL,Buffer.begin(),NULL,MB_OK);

但是,上面这段程序,可读性能差。别人会想:作者为什么给个"a"而不是"b"呢?

所以我想请教大家:
(1)这问题有没有更好的方法?最好不要MFC,也不用char数组,因为整个程序中其它地方我都用了string。
(2)STL为什么这么设计?
难道定义Buffer以后,还没有分配空间?如果已经有空间,为什么不用Begin()返回首个字符的地址?这样做意义呵在?


解答一:

1// 这么定义:
2string Buffer(256'\0');
3// 或者
4string Buffer;
5Buffer.reserve(256);

解答二:
1// 1.使用boost:Buffer = boost::lexical_cast<string>(10);
2// 2.如果不想用boost:
3#include <sstream>
4
5std::stringstream sstr;
6sstr << 10;
7Buffer = sstr.str();
8// 或者:
9Buffer = (std::stringstream() << 10).str(); 

解答三:
 1  std::vector<char> buf(buffer_size, 0);
 2  _snprintf(&buf[0], buffer_size, "%d\0"10);
 3  // 赋值给字符串
 4  std::string str = &buf[0];
 5  MessageBox(NULL, str.c_str(), NULL, MB_OK);
 6//好处:
 7//    1. 使用std::vector避免手动new/delete
 8//    2. 使用stl可以充分利用stl的alloc(如stlport的memory pool)
 9//    3. 使用_snprintf防止溢出
10//    4. std::string = std::vector(安逸:)

解答四:
1  char buf[32];
2  _snprintf(buf, 32"%d"10);//或者用itoa(10, buf, 10);
3  string str = buf;

有朋友发现一个错误:
看到一个明显错误的做法:str.reserve(NLEN)之后直接去sprintf。要知道reserve只是把capacity扩充到NLEN,并不会扩充size。对于某些标准库实现,这样的做法极端危险,它会破坏string的不变式,导致一系列严重问题,比如str.size()str.length()得到错误的值。

oscar.ken@gmail.com
 1#ifdef  UNICODE
 2
 3# define tchar wchar_t
 4# define tstring std::wstring
 5
 6#else
 7
 8# define tchar char
 9# define tstring std::string
10
11#endif
12inline tstring FormatString(const tchar* fmt, )
13{
14 static tchar tmp[2048];
15 memset(tmp, 02048 * sizeof(tchar));
16 va_list args;
17 va_start(args, fmt);
18 int re = _vsntprintf(tmp, 2048, fmt, args);
19 va_end(args);
20 return tstring(tmp);
21}

22
23// 如果2048不够用,可以改造一个template版本

千里马肝:
如果这样
那不如直接使用boost::format导出一个stream的string,更安逸(当然会慢一些)
 
PS,对于FormatString为了保证format出来的是一个string,每次memset,个人认为无大必要,不如自动在formatstring的最后每次自动加上\
0  (XD)

如果我没有记错的话
_snprintf是不会自动补\0的
而sprintf会
所以要么char buf[
32= {0},要么_snprintf( "%d\0")
另外vector的使用是为了配合“不定长buf”而存在,并非buf[
32]的替代品

Jiong Tu:
你搞错了,不补0的是strncpy,不是snprintf

吴咏炜:
用 STL 的最大好处就是空间大小可以自动增长,不会发生缓冲区溢出(安全问
题)。否则,又何必付出缓慢的堆上分配的代价呢?——除非要把结果传回去,那还
有意义;但最初苏益彧提出的问题中并不存在这样的需求。

另外顺便提一下,如果栈上分配内存大小不固定,也不一定就要改用堆上分配。
C99 支持数组大小运行时决定(而非 C89
/C++98 的编译时决定),而(不支持
C99 的)大部分 C
/C++ 编译器也都支持一个非标准的 alloca 函数用于进行栈上
分配。这个函数通常由编译器内联实现,需要效率的场合会用得上。

另外,你测出的 
50% 应当是总体的性能下降。纯粹的内存分配/释放操作,堆上分
配和栈上分配的性能根本不在同一个量级,差距通常在十倍以上。

posted @ 2006-03-03 11:20 HuYi 阅读(4103) | 评论 (0)编辑 收藏

C++ 中大家使用什么样的事件模型?

WL 提出:
很明显 C++ 里面没有一个很好的事件模型,除了 VC7
的统一事件模型之外,不知道大家都用的什么样的事件模型,都是自己写的吗?VC7的统一事件模型不知道性能、开销如何,文档太少了。

详细请参阅:

http://groups.google.com/group/dev4server/browse_thread/thread/5e87109f87d60472/0acd3059709df059

posted @ 2006-03-03 11:16 HuYi 阅读(409) | 评论 (0)编辑 收藏

仅列出标题
共7页: 1 2 3 4 5 6 7 

导航

统计

常用链接

留言簿(12)

随笔分类

相册

收藏夹

友情链接

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜