如何在内存

时间:2015-10-14 17:26:53

标签: c++ memory

我正在开展一个项目,我绝对需要在内存中连续存储数据。 我想存储一些(最多100个)字符串(我不知道每个字符串的实际大小)。所以我将创建一个包含100个元素的字符串向量。

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

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

3 个答案:

答案 0 :(得分:8)

  1. 每个string都是类string的实例,该实例将包含char*
  2. 向量中的string个对象将位于连续的内存中。
  3. 每个string的字符将在连续的记忆中
  4. 除非为字符串定义自定义std::allocator,否则所有字符串的字符都不会在连续的内存中
  5. 当您增加vector的尺寸或致电shrink_to_fit
  6. 时,字符串内存中的位置可能会发生变化
  7. 当您增加string
  8. 的尺寸时,每个string的字符内存位置可能会发生变化
  9. 如果您修改或删除其中一个字符串
  10. ,则不会重新分配vector
  11. 有一种叫做小字符串优化的东西。如果发挥作用,则每个string的字符将存储在string内,而不是char*所指向的其他位置

答案 1 :(得分:2)

DXGI_FORMAT_R8_UNORM中的数据是连续的。但是std::vector的实现并不能保证持有字符数组的内存本地存储在类本身中。怎么可能呢?就像你说的那样,你不知道字符串有多大。

许多类似数组的结构都有如下布局:

std::string

这意味着100个字符串的向量将具有100个类布局实例,这些实例指向存储字符串的内存。

现在,如果您需要尽可能紧密地打包内存分配并仍想使用class string { T * begin; T * end; T * capacity; } ,则可以编写自定义allocator

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

答案 2 :(得分:2)

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

因此,如果您确实需要char在内存中连续,则必须只使用vector<char>