如何在C 14中提高“str1 str2 str3 ……”的效率?

如何在C 14中提高“str1 str2 str3 ……”的效率?,第1张

概述std::string Concatenate(const std::string& s1, const std::string& s2, const std::string& s3, const std::string& s4,
std::string Concatenate(const std::string& s1,const std::string& s2,const std::string& s3,const std::string& s4,const std::string& s5){    return s1 + s2 + s3 + s4 + s5;}

默认情况下,返回s1 s2 s3 s4 s5;可能等同于以下代码:

auto t1 = s1 + s2; // Allocation 1auto t2 = t1 + s3; // Allocation 2auto t3 = t2 + s4; // Allocation 3return t3 + s5; // Allocation 4

有一种优雅的方法可以将分配时间减少到1吗?我的意思是保持返回s1 s2 s3 s4 s5;没有改变,但效率自动提高.如果可能的话,它也可以避免程序员误用std :: string :: operator.

ref-qualifIEr成员函数有帮助吗?

解决方法 问题的前提是:

s1 + s2 + s3 + s4 + s5 + ... + sn

将要求n分配不正确.

相反,它将需要O(Log(n))分配.第一个s1 s1将生成一个临时的.随后,临时(rvalue)将成为所有后续 *** 作的左参数.该标准指定当字符串的lhs是rvalue时,该实现只是附加到该临时值并将其移出:

operator+(basic_string<charT,traits,Allocator>&& lhs,const basic_string<charT,Allocator>& rhs);Returns: std::move(lhs.append(rhs))

该标准还规定了字符串的容量将在几何上增长(通常在1.5和2之间).因此,在每次分配时,容量将以几何方式增长,并且该容量沿着 *** 作链传播.更具体地说,原始代码:

s = s1 + s2 + s3 + s4 + s5 + ... + sn;

实际上相当于:

s = s1 + s2;s += s3;s += s4;s += s5;// ...s += sn;

当几何容量增长与短串优化相结合时,“预先保留”正确容量的值是有限的.如果这样的代码实际上显示为性能测试中的热点,我只会费心去做.

总结

以上是内存溢出为你收集整理的如何在C 14中提高“str1 str2 str3 ……”的效率?全部内容,希望文章能够帮你解决如何在C 14中提高“str1 str2 str3 ……”的效率?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1224041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存