Cnangel: October 2008的归档

数组越界错误,主要表现在这几个方面:
1,分配数组没有以\0结尾,计算数组大小时,导致用函数strlen去取大小时不是预料中的大小;
2,定义数组时,没有memset,而直接采用数组最后一位下标赋值为0的方法,虽然比memset高效,但是往往下标越界,导致错误;
3,分配数组大小时,没有考虑特殊情况,往往想当然;或者开始想好了,但是决策变化,但是数组的大小分配仍然没有变化,导致数组越界错误;
4,另外,关于越界问题,类型的分配不对,unsigned short 最长只能65535,如果超过此长度,也会导致越界问题;

介于此:
1,每次分配数组大小时,估计的数组大小要比原来大小大1个字节,用于\0截断字串;
2,在性能要求不太重要时,memset往往比下标赋值安全;
3,在数组分配大小时,最好采用定义变量值的方式或者动态分配大小,定义变量值能够是决策发生变化时,很容易修改代码,动态分配容易除了能够节省内存外,还能找出隐藏的越界问题;
4,对于类型的越界问题,需要多用valgrind等内存检查工具来检测,另外,注释你所写的代码来检查代码发生错误的地方也不失一种检查代码的好办法。

引文:http://bbs.chinaunix.net/thread-1293425-1-4.html

某人的写法,GBK方式,两个字节一个汉字:


    int i = 32768;
    for (; i < 65536; i ++)
    {
        if (i % 256 < 0x20)
            printf("  ");
        else
        {
            printf("%c%c", i / 256, i % 256);
            if (i % 32 == 31) printf("\n");
        }
    }


汉字的范围肯定小于等于65535,我们可以将所有从0x20(空格)之后到65535的字符直接循环全部打印出来,这里做了一次UTF8转换:

char.tar.bz2

  • 实验环境
    1. 操作系统 fedora9
    2. 编译器版本 gcc4.3
  • 实验方式
  各种map使用插入和查找,比较速度和相关性能
  • 代码
    • 参考代码
    • 下面测试说明了速度之间的比较:
map类型 插入速度 插入和查找速度
hashmap 0m0.123s 0m0.369s
map 0m0.190s 0m0.681s
unordered_map 0m0.123s 0m0.315s

  • 为什么要使用unordered_map代替hash_map?
    • 因为标准化的推进,unordered_map原来属于boost分支和std::tr1中,而hash_map属于非标准容器。
    • 另外,使用之后,感觉速度和hash_map差不多,但是支持string做key,也可以使用复杂的对象作为key。
    • gxx需要添加编译选项:-std=gnu++0x或者-std=c++0x
    • 在/usr/include/c++/4.3.0/backward/backward_warning.h文件中,明确写道:

This file includes at least one deprecated or antiquated header which \ may be removed without further notice at a future date. Please use a \ non-deprecated interface with equivalent functionality instead. For a \ listing of replacement headers and interfaces, consult the file \ backward_warning.h. To disable this warning use -Wno-deprecated.

/* A list of valid replacements is as follows:

Use: Instead of:
<sstream>, basic_stringbuf <strstream>, strstreambuf
<sstream>, basic_istringstream <strstream>, istrstream
<sstream>, basic_ostringstream <strstream>, ostrstream
<sstream>, basic_stringstream <strstream>, strstream
<unordered_set>, unordered_set <ext/hash_set>, hash_set
<unordered_set>, unordered_multiset <ext/hash_set>, hash_multiset
<unordered_map>, unordered_map <ext/hash_set>, hash_map
<unordered_map>, unordered_multimap <ext/hash_set>, hash_multimap
<functional>, bind <functional>, binder1st
<functional>, bind <functional>, binder2nd
<functional>, bind <functional>, bind1st
<functional>, bind <functional>, bind2nd
<memory>, unique_ptr <memory>, auto_ptr
*/

关于函数getopt_long()

| 暂无评论
getopt()经常用作一些复杂的参数调配。
C和Perl都会用到这个,这里设计了一个简单的模板,针对getopt_long()函数。

印象中的哈尔滨

| 暂无评论

利用空闲的时间,去哈尔滨看看可爱的她,顺便游玩一趟,虽然南方炙热如火,但是哈尔滨的已秋色萧萧。
我去的是老区,灰色的建筑,典雅而古老,仿佛在遥远的20世纪30年代。

关于此归档

这里是CnangelOctober 2008发表的所有日记。

上一篇日记Cnangel: September 2008

下一篇日记Cnangel: November 2008

主索引归档页可以看到最新的日记和所有日记。

August 2012

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Powered by Movable Type 5.14-en