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复制到此副本的末尾 因此,如上例所示的链应该导致:2) – > 6) – > 11) – > 8),没有任何lhs的副本,只是修改了第一次操作(创建临时字符串)产生的r值的缓冲区. 因此,一旦运算符至少使用r值参数,这似乎与operator =一样有效.这是正确的,在C 11中使用operator = over运算符是否有任何意义,之后,除非两个参数都是l值字符串? 编译器还可以进行哪些优化? 编辑:澄清问题的意图.初始部分仅涉及语言的细节(实施不具备);最后一个问题是关于其他优化. 解决方法
字符串是一个相当不透明的对象:它包含一个内部字符缓冲区并按照它想要的方式管理它.向字符串添加单个字符可能会在分配新缓冲区,初始部分的副本和添加部分的副本时结束.全部取决于分配的缓冲区是否足够大以接受添加的部分.
报价说:
换句话说,新的分配,旧缓冲区的完整拷贝和释放… 当你谈到效率和优化时,你必须记住编译器不遵循你编写程序的方式.由于as-if规则,它可以优化它想要的方式,只要遵守可观察的行为. C标准说:
一张便条甚至解释说:
所以很可能a = a b;和a = b;编译完全相同的代码. 编写C程序时,不应该担心低级优化:编译器会关心它,通常说编译器比你聪明.只有在确定了真正的瓶颈时才会这样做,并且如果仅针对一个体系结构和一个配置上的一个编译器,请注意低级优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 数组 – 仅在索引存在时编辑索引
- c# – 如何从Visual Studio 2012项目中删除假装置?
- objective-c – 什么时候调用initWithCoder?
- For XML Path
- React 可视化开发工具 Shadow Widget 非正经入门(之五:指
- 如何在VB.Net CallByName中将代码模块指定为“Object Ref”
- 关于夏天出生的人,Flex前端显示出生时间少一个小时和Ubunt
- Java设计模式学习记录-组合模式 Java设计模式学
- iphone – UIImage imageNamed:在蓝色引用的Xcode文件夹中
- 如何在一台主机上安装多个版本oracle数据库