【发布时间】:2016-01-12 22:14:54
【问题描述】:
我正在做一个项目,我绝对需要在内存中拥有连续的数据。 我想存储一些(最多 100 个)字符串(我不知道每个字符串的实际大小)。所以我将创建一个包含 100 个元素的字符串向量。
std::vector<std::string> vect;
vect.reserve(100)
但字符串可以是任意大小。那么它是怎样工作的?每次更改字符串时,我的向量都会重新分配吗?还是 std::string 就像指向字符串第一个字符的指针一样,就像 char* 将用于 C 字符串?
【问题讨论】:
-
std::string在您的示例中表现得像一个指针。有小字符串优化,其中小字符串(小意味着〜20-40个字符)位于std::string本身内。如果您要求所有字符都在连续的内存中,则必须使用vector<char>并手动执行。 -
谢谢,这种信息很珍贵,因为字符串可以做背景的事情,所以我才问这个。你说的是它做了一些优化,可能使它不连续?
-
A
std::string是动态分配的,并保证始终具有 local 连续内存(意味着单个字符串将具有连续内存)。但是,这并没有说明它在您的vect或strings 中的连续性。我不知道以这种方式保证连续性的方法。 -
@cmbasnett
std::string的构造函数有一个std::allocator的可选模板参数。您可以定义一个内存池,每次创建string时都会在其中分配。您可以确保所有字符串都在一个连续的内存块中。