C字符串连接优化

C字符串连接优化,第1张

概述看一段像这样的代码(添加评论): std::string some_var;std::string some_func(); // both are defined, but definition is irrelevant...return "some text " + some_var + "c" + some_func(); // intentionally "c" not 'c' 我 看一段像这样的代码(添加评论):

std::string some_var;std::string some_func(); // both are defined,but deFinition is irrelevant...return "some text " + some_var + "c" + some_func(); // intentionally "c" not 'c'

我想知道,在这种情况下,std :: string的运算符必须复制(在使用复制构造/赋值的意义上,而不是复制的内部缓冲区,例如SSO适用),以及实际复制的内容.快速浏览一下cppreference只是部分有用,因为它列出了12个(!)不同的情况.在某种程度上,我要求确认我对该页面的理解:

>案例1)制作lhs的副本,然后将rhs复制到此副本的末尾
>在C 98案例2) – 5)从char / const char *参数构造一个临时字符串,然后在案例1)中生成
>在C 11情况2) – 5)从中构造一个临时字符串
char / const char *参数,然后导致情况6)或7)
>在C 11情况6) – 12)r值参数将使用insert / append进行变异,如果提供了char / const char *参数,则由于insert / append上的重载,不需要临时值.在所有情况下,返回r值以便于进一步链接.没有复制(除了要在插入位置附加/插入的参数的副本).可能需要移动字符串的内容.

因此,如上例所示的链应该导致:2) – > 6) – > 11) – > 8),没有任何lhs的副本,只是修改了第一次 *** 作(创建临时字符串)产生的r值的缓冲区.

因此,一旦运算符至少使用r值参数,这似乎与operator =一样有效.这是正确的,在C 11中使用operator = over运算符是否有任何意义,之后,除非两个参数都是l值字符串?

编译器还可以进行哪些优化

编辑:澄清问题的意图.初始部分仅涉及语言的细节(实施不具备);最后一个问题是关于其他优化.

解决方法 字符串是一个相当不透明的对象:它包含一个内部字符缓冲区并按照它想要的方式管理它.向字符串添加单个字符可能会在分配新缓冲区,初始部分的副本和添加部分的副本时结束.全部取决于分配的缓冲区是否足够大以接受添加的部分.

报价说:

… No copIEs are made (except the copy of the arguments to be appended/inserted at the insertion location). The contents of the string may need to be moved.

换句话说,新的分配,旧缓冲区的完整拷贝和释放…

当你谈到效率和优化时,你必须记住编译器不遵循你编写程序的方式.由于as-if规则,它可以优化它想要的方式,只要遵守可观察的行为. C标准说:

1.9 Program execution [intro.execution]

5 A conforming implementation executing a well-formed program shall produce the same observable behavior
as one of the possible executions of the corresponding instance of the abstract machine with the same program
and the same input.

一张便条甚至解释说:

an implementation is free to disregard any requirement of this
International Standard as long as the result is as if the requirement had been obeyed,as far as can be determined from the
observable behavior of the program.

所以很可能a = a b;和a = b;编译完全相同的代码.

编写C程序时,不应该担心低级优化:编译器会关心它,通常说编译器比你聪明.只有在确定了真正的瓶颈时才会这样做,并且如果仅针对一个体系结构和一个配置上的一个编译器,请注意低级优化.

总结

以上是内存溢出为你收集整理的C字符串连接优化全部内容,希望文章能够帮你解决C字符串连接优化所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存