我正在开展一个项目,我绝对需要在内存中连续存储数据。 我想存储一些(最多100个)字符串(我不知道每个字符串的实际大小)。所以我将创建一个包含100个元素的字符串向量。
std::vector<std::string> vect;
vect.reserve(100)
但是String可以是任何大小的。那么它是怎样工作的?每次更改字符串时,我的矢量是否重新分配?或者是一个std :: string就像一个指向字符串第一个字符的指针,就像char *将用于C字符串一样?
答案 0 :(得分:8)
string
都是类string
的实例,该实例将包含char*
。string
个对象将位于连续的内存中。string
的字符将在连续的记忆中std::allocator
,否则所有字符串的字符都不会在连续的内存中vector
的尺寸或致电shrink_to_fit
string
string
的字符内存位置可能会发生变化
vector
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>
。