2015-10-14 46 views
4

我正在开发一个项目,我绝对需要在内存中有连续的数据。 我想存储一些(最多100个)字符串(我不知道每个字符串的实际大小)。所以我会创建一个由100个元素组成的向量。如何在内存中存储矢量<string>

std::vector<std::string> vect; 
vect.reserve(100) 

但是一个字符串可以是任意大小。那么它是怎样工作的?每当我更改一个字符串时,我的矢量是否会重新分配?或者是一个std :: string就像一个指向字符串第一个字符的指针,就像char *将用于C字符串一样?

+0

http://stackoverflow.com/questions/1986966/does-s0-point-to-contiguous-characters-in-a-stdstring –

+2

'std :: string'的行为就像你的例子中的一个指针。有一个小字符串优化,其中小字符串(小意味着〜20-40个字符)在'std :: string'本身内部。如果你需要所有的字符在连续的内存中,你将不得不使用'vector '并手动完成。 – nwp

+0

谢谢,那种信息是宝贵的,因为字符串可以做背景的事情,这就是为什么我问这个。你说的是,它做了一些优化,可能会使它不连续? – FreeYourSoul

回答

7
  1. 每个stringstring类的一个实例和该实例将包含char*
  2. 向量中的string对象将在连续内存中。
  3. 每个string的字符将在连续的内存
  4. 所有所有字符串的字符不会在连续的内存,除非你定义一个自定义std::allocator的字符串
  5. 在字符串的内存位置可能当你增加的string
  6. 如果修改了vector将无法​​重新分配或Remo的大小,当你增加vector的大小或致电shrink_to_fit
  7. 位置在每个string的字符内存的变化可能会改变ve其中一个字符串
  8. 有一种叫做的小字符串优化。如果进场的每个string的字符将被存储在string,而不是其他位置指向内通过char*
+0

所以一个字符串实际上只是一个字符的封装* – FreeYourSoul

+0

它的模板,但如果你只使用默认的std :: string,那么是的。 –

+1

@FreeYourSoul它有更多的东西,如容量和大小,而不仅仅是'char *'。 – nwp

2

std::vector的数据contiguosly布局。但是std::string的实现并不能保证持有字符数组的内存本地存储到类本身。它怎么可能?就像你说的,你不知道弦会有多大。

很多阵列状结构的具有布局等如下:

class string 
{ 
    T * begin; 
    T * end; 
    T * capacity; 
} 

这意味着您100串的矢量将具有类布局指向其中字符串被存储在存储器100个的实例。

现在,如果您需要尽可能紧密地打包内存分配,并且仍然想使用std::string,则可以编写自定义allocator

也许你可以将字符串数据写入char数组,并有第二个容器来存储每个单独的字符串+ NULL终止符的长度。

2

string的实现是实现定义的,并且实际上在某些编译器的不同版本之间发生了变化(例如,从gcc 4.9到5.0)。即使您使用自定义分配器,也绝对不能保证连续string s在内存中连续存在,

所以如果你真的需要char s在内存中是连续的,你只能使用vector<char>