gpt4 book ai didi

c++ - 为什么 VS2008 std::string.erase() 移动它的缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:21 25 4
gpt4 key购买 nike

我想逐行读取文件并捕获特定的输入行。为了获得最佳性能,我可以通过读取整个文件并使用指针迭代其内容来以低级方式执行此操作,但这段代码对性能并不关键,因此我希望使用更具可读性和类型安全性的 std 库样式实现。

所以我有这个:

 std::string line;
line.reserve(1024);
std::ifstream file(filePath);
while(file)
{
std::getline(file, line);
if(line.substr(0, 8) == "Whatever")
{
// Do something ...
}
}

虽然这不是性能关键代码,但我在解析操作之前调用了 line.reserve(1024) 以防止在读入较大的行时对字符串进行多次重新分配。

在 std::getline 中,字符串在将每行的字符添加到它之前被删除。我逐句检查这段代码是为了让自己确信内存并没有在每次迭代中都被重新分配,我发现这让我大吃一惊。

深入 string::erase 而不是仅仅将其大小变量重置为零,它实际做的是使用指针值调用 memmove_s,该指针值将用紧随其后的缓冲区的未使用部分覆盖缓冲区的已使用部分,除了正在调用 memmove_s,计数参数为零,即请求移动零字节。

问题:

为什么我要在可爱的循环中间调用库函数的开销,尤其是被调用时什么都不做的循环?

我自己还没有把它拆开,但在什么情况下这个调用实际上什么都不做,而是开始移动缓冲区 block ?

为什么要这样做?

奖励问题:C++ 标准库标记是什么?

最佳答案

这是我一年前报告的一个已知问题,要利用此修复,您必须升级到编译器的 future 版本。

Connect Bug: "std::string::erase is stupidly slow when erasing to the end, which impacts std::string::resize"

标准没有说明任何 std::string 函数的复杂性,swap 除外。

关于c++ - 为什么 VS2008 std::string.erase() 移动它的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com