这个问题以一段代码开始,因为我认为这样更容易看出我的目的:
/*static*/
void
Url::Split
(std::list<std::string> & url
, const std::string& stringUrl
)
{
std::string collector;
collector.reserve(stringUrl.length());
for (auto c : stringUrl)
{
if (PathSeparator == c)
{
url.push_back(collector);
collector.clear(); // Sabotages my optimization with reserve() above!
}
else
{
collector.push_back(c);
}
}
url.push_back(collector);
}
在上面的代码中,
collector.reserve(stringUrl.length());
行旨在减少循环下面执行的堆操作量。毕竟,每个子字符串都不能比整个 url 更长,因此像我这样保留足够的容量看起来是一个好主意。但是,一旦一个子字符串完成并添加到 url 部分列表中,我需要以某种方式将字符串重置为长度为 0。简短的“查看定义”检查让我认为,至少在我的平台上,保留的缓冲区将被释放,这样,我的 reserve() 调用的目的就会受到影响。
在清除的情况下,它内部调用了一些
_Eos(0)
。我也可以通过
collector.resize(0)
来实现相同的效果,但是查看定义显示它也内部调用 _Eos(newsize)
,因此行为与调用 clear()
的情况相同。现在的问题是,是否有一种便携式的方法来建立预期的优化,并且哪个
std::string
函数可以帮助我做到这一点。当然,我可以写成
collector[0] = '\0';
,但对我来说看起来很奇怪。附注:虽然我找到了类似的问题,但我不认为这是任何一个问题的重复。
提前致谢。
clear
不会替换缓冲区,但我在C++11中没有看到任何这样的保证。可能它存在,但不明显。 - Cheers and hth. - Alf