空间广告
在线情况
楼主
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 财富1
  • 积分634
  • 经验17284
  • 文章441
  • 注册2008-05-18
data()与c_str()的一些微妙的关系
      string类型中的两个成员函数data()和c_str(),它们的作用都是返回一个sring对象所对应的const char*,可是它们之间又有什么区别呢?事情原来是这个样子嘀►
data() 返回一个缓冲区的首地址,其中包含字符串中每个字符,并且是连续的。
c_str() 除了满足以上条件,还保证结尾添一个 '\0'。

data() 和 c_str() 返回的缓冲区都是只读的。

具体实现中,
字符串可以不连续存储,仅仅调用 data() 或者 c_str() 的时候临时分配一块缓冲区,
或者利用上次的缓冲区,如果足够大的话,析构时释放这块缓冲区。
字符串修改时不会不值得也无法同步这个缓冲区(比如字符串扩大时),所以标准规定
data() 和 c_str() 返回的指针所指向的缓冲区的有效期保证到下一次修改字符串或者
析构之前。

当然也可以是连续的,这样实现起 data() 就简单了,直接返回内部缓冲区的地址即可?
至于 c_str(),则要看字符串的实现是否在结尾维护一个额外的 '\0',如果维护,那么
c_str() 就可以和 data() 一样实现,否则就需要另外准备缓冲区。

因此代价上,data() <= c_str()

多数标准库的实现都采用连续存储,结尾维护额外的 '\0' 的方式。也有些例外。比如
STLPort 的实现就采用连续存储,不维护 '\0' 的方式。

维护一个 '\0' 的代价是多费一个字节的内存,实现时需要多一点额外的维护代码。
好处则是 data() 和 c_str() 的实现简单高效,也便于在调试其中察看。

如果我来实现,我会采用连续存储维护额外 '\0'的方案,实际上,我以前的几个实现
都采用的这个方案。

如果连续存放,那么 data() 直接返回首地址,c_str() 则需要再去补一个 '\0'。
我刚才看了 STLPort 的实现,比较巧妙,平时不维护 '\0',c_str() 的时候强制补一个
'\0',并不额外分配缓冲区。
STLPORT 也可以随时维护 '\0',定义
_STLP_FORCE_STRING_TERMINATION
即可。
风之帝国校务管理系统
loading...
loading...
loading...
loading...
loading...
loading...
loading...
回复帖子 注意: *为必填项
*验证信息 用户名 密码 注册新用户
*帖子名称
内容(最大50K)




其它选项 Alt+S快速提交
 


Powered by LeadBBS 9.1 licence.
Page created in 0.1410 seconds with 4 queries.