读书人

std:string 的数据内存是否连续?解决

发布时间: 2012-03-17 19:06:27 作者: rapoo

std::string 的数据内存是否连续?
对于std::vector来说,我们知道,内部存储的数据内存空间是连续的,因此代码如下是正确的:

std::vector<char> vtContent(MAX_NUMBER,0);
...
ReadFile(hFile,&vtContent[0],MAX_NUMBER,&dwRead);


那对于std::string来说,这样是否正确呢?
std::string stContent(MAX_NUMBER,0);
...
ReadFile(hFile,&stContent[0],MAX_NUMBER,&dwRead);

在C++编程规范中提到,std::string类型的存储内存是否连续需要根据不同的stl实现来定,但我觉得这个有点牵强。
我先说说自己的理由,
std::string可以用[]来获取数据,这个是C++标准规定的;如果用[]可以,那么应该也可以使用指针形式:
比如,char ch = stContent[5],
我们可以用指针:
char *pCont = reinterpret_cast<char *>(&stContent[0]);
char ch = *(pCont + 5);
如果可以用指针步进的话,那么内存应该是连续的才对。

当然,这个例子也有漏洞,如果说std::string内存不是连续也说得过去:
首先是std::string已经重载了[]操作符,用[]获取数据并不是根据内存连续来进行。指针可以用来指向数据,应该是不行的,例子的漏洞可能发生在转换中:reinterpret_cast<char *>。

想不明白,望大家指教~

[解决办法]
std::string可以用[]来获取数据,这个是C++标准规定的;如果用[]可以,那么应该也可以使用指针形式

能用[]来获取数据,可不表示“如果用[]可以,那么应该也可以使用指针形式”。[]只是一个运算符重载,它可以是经过重计算得到的,它的数据内容不一定就是连续的。
[解决办法]
s.c_str()是连续的。
&s[0]不一定是连续的。
[解决办法]
连续,实际上 sting 和 vector 可以互换,不过好像标准没有说string是连续的
[解决办法]
大多数的实现是连续的,但标准没有规定一定要连续,所以有可能不连续.
[解决办法]
刚看了看vc7的sdk中的string
肯定是连续的。
_Elem _Buf[_BUF_SIZE];
_Elem *_Ptr;
[解决办法]
连续不连续,看标准啊,我查了iso14882 标准,里面没有要求 string 一定要使用连续存储空间。所以有的实现可能使用连续存储,有的不使用,就是这样。不怕死的当然也可以假设所有的实现都是使用连续存储的…

读书人网 >C++

热点推荐