gpt4 book ai didi

C++ 字符串连接优化

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

看一段这样的代码(添加注释):

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::stringoperator + 必须进行复制(在使用复制构造/赋值的意义上,而不是被复制的内部缓冲区,例如如果 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) 中,右值参数将被 insert/append 改变,如果 char/const char* 参数已提供,由于 insert/append 上的重载,不需要临时文件。在所有情况下,都会返回一个 r 值以促进进一步链接。不制作任何拷贝(除了要在插入位置附加/插入的参数的拷贝)。可能需要移动字符串的内容。

因此,像上面示例这样的链应该导致:2) -> 6) -> 11) -> 8),没有创建任何 lhs 的拷贝,而只是修改了 r 值的缓冲区从第一个操作(创建临时字符串)开始。

因此,这似乎与 operator += 一样有效,一旦 operator + 至少使用了右值参数。这是否正确,在 C++11 及之后的 operator + 上使用 operator += 是否有任何意义,除非两个参数都是 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++ 字符串连接优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41857372/

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