饭中淹的避难所~~~~~

偶尔来避难的地方~

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  94 随笔 :: 0 文章 :: 257 评论 :: 0 Trackbacks

我一般编程的时候,喜欢用我自己设计的string类,最近在设计结构体的时候,我想到了一个适合结构体使用的string类的设计方法,不过可能我比较孤陋寡闻,这个方法以前就有人实现过,不过还是记录下来。

一般来说,string,至少需要保存一个char*的指针和一个int的长度,复杂点的,可能还需要更多的成员。

这样的话,我们需要至少8个字节来保存这个string对象(32bit下)。

在部分场合,我们可能会希望把一个指针替换为一个string对象,或者把一个string对象,替换为一个指针,而且我们对结构体的大小很敏感,union也行不通。如果我们放一个string的指针,那么我们就需要new一个string对象出来,然后string内部再去new一个char[]的数组。

为此,我想了一个办法来解决这个问题。我在string内部引入一个context的东西,它保存了所有string的成员变量,然后结尾是字符串数组,形似下面这个结构:

1    typedef struct tagStringContext
2    {
3        int nMaxLength;
4        int nLength;
5        char szBuf[1];
6    }
t_StringContext;
7

每次分配内存的时候,把这个结构放在头部,然后分配 长度+sizeof(int)*2的内存,用来创建一个字符串。

m_pContext = (t_StringContext*)alloc( sizeof(int)*2 + nMaxLength );
m_pContext
->nMaxLength = nMaxLength;
m_pContext
->nLength = nLength;
memcpy( (LPVOID)m_pContext
->szBuf, (LPVOID)pszString, nLength + 1 ); // with zero tail

这样,string类只要有m_pContext这一个成员就行了,而这个成员,就是t_StringContext*类型的,它是一个指针。这就意味着,它可以从任意的可以容纳一个指针的位置构造出来。
如果你在考虑如果m_pContext为null怎么办的话,那当然是string返回空字符串和0 length了。

这种方法只要做一次内存分配,就可以在一个指针位置构造出一个string对象来。

不过,一定要保证string类里面没有虚函数,因为它会在类对象的前头加上一些信息(虚表指针之类的东西)。

另外,因为我对其他编译器不是很熟悉,我只在ms vc8.0,7.0,6.0自带的编译器上测试过。而在其他编译器上,这个方法可能失效。


posted on 2008-04-11 11:13 饭中淹 阅读(2772) 评论(9)  编辑 收藏 引用

评论

# re: 对string类的思考 2008-04-11 12:18 raof01
虽然你的想法已经有很多人这么做了,不过我觉得你自己想出来也很了不起,敬仰啊。  回复  更多评论
  

# re: 对string类的思考 2008-04-11 13:16 cppexplore
呵呵,以前写c语言常用的方法。
c语言中,指针在结构体里的使用,真是非常的精巧。  回复  更多评论
  

# re: 对string类的思考[未登录] 2008-04-11 13:58 zzz
delphi 里面的字符串?  回复  更多评论
  

# re: 对string类的思考 2008-04-11 14:30 大海
我受益匪浅  回复  更多评论
  

# re: 对string类的思考 2008-04-11 14:31 giscn
建议看看VC6 CString 的实现  回复  更多评论
  

# re: 对string类的思考 2008-04-11 17:24 eXile
VC6 CString 的字符串也就是常见的引用计数, 象lz这种实现, 再配合一个好用的内存池, 应该是蛮不错的.   回复  更多评论
  

# re: 对string类的思考 2008-04-11 20:12 空明流转
shared_ptr<string> / string*,一切都搞定了。  回复  更多评论
  

# re: 对string类的思考 2008-04-14 13:10 阿福
你用GCC试试:sizeof(string)=4
GCC的内存池考虑了更多的东西。
看看我的分析,交流下思路:
http://blog.csdn.net/ah__fu/archive/2008/02/05/2084270.aspx
复杂的GCC字符串池  回复  更多评论
  

# re: 对string类的思考[未登录] 2008-06-17 18:58 christanxw
类似于MFC CSting的内存结构  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理