gpt4 book ai didi

C++字符串内存重用优化

转载 作者:太空宇宙 更新时间:2023-11-03 10:32:30 25 4
gpt4 key购买 nike

我想知道 tmp 的字符串内存是否可以在下面的代码中重用。它的内存是否在每次迭代中重新分配?有没有更好的方法来处理这种情况?

string s, line;
map<string, string> mymap;
while(getline(file, line) {
if(a) s = "_a";
else if(b) s = "_b";
string tmp = line + s;
mymap.insert(tmp, s);
}

最佳答案

tmp 每次在循环中创建和销毁,并在 line 中获取字符串数据的拷贝。因此,您可以获得像这样的便宜的可能改进并且几乎不会更糟的东西:

if(a) s = "_a";
else if(b) s = "_b";
line += s;
mymap.insert(line, s);

我还会给 s 类型const char*:在每个循环中只分配一次 string 没有多大意义文字的拷贝。但它确实通过调用 insert 转换为 string,因此无论哪种方式都没有太多内容。

只要您不破坏代码的简单性/可读性/可维护性/设计来实现它,可能的改进并且几乎不可能更糟并不是过早的优化。 lines 的范围越大,玩弄它们的风险就越大(分别改变值和改变类型),因为你可能会以某种方式误导读者/维护者。这是短函数很好的原因之一。

在 C++11 中,您可以编写 mymap.insert(std::move(line), s); 以获得另一个简单的可能改进。

综上所述:您可能会发现,无论您进行多少不必要的复制和分配,与 getline 中的 I/O 时间相比,这样做所花费的时间都相形见绌。在这种情况下,有两种非常相似的代码编写方式,其中一种“应该”更有效率。因此,您不妨使用它,但不要高估它,认为它一定会有所作为。

关于C++字符串内存重用优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12616988/

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