我正在用 C++ 编码。让我们成为一些字符串。我被要求确定以下哪个更快:
cout << "s:" + s + "s:" + s + " s:" + s + "\n";
cout << "s:" << s << "s:" << s << " s:" << s << "\n";
我反复运行它们,发现第二个更快。我花了一段时间试图找出原因。我认为这是因为在第一个中,字符串首先连接然后输出到屏幕。但第二个只是直接输出到屏幕上。那是对的吗?
第一个可能涉及为字符串连接分配一些内存,然后将最终连接的字符串复制到输出缓冲区。第二个将简单地将已分配的字符串数据复制到已分配的输出缓冲区。
从理论的角度来看,第二个示例是线性时间,而第一个示例可以是二次时间(以子串的数量表示),具体取决于实现。
要确定您的实现是否属于这种情况,您必须查看源代码和(因为编译器可能会优化)机器代码。
简而言之,原因取决于实现,并且通常要确定“哪个最快”,您别无选择,只能MEASURE。“原因”可以作为启发式指南。但仅此而已:最终,衡量标准和现实才是最重要的。
由于第一个创建字符串对象,您认为第二个更快的假设可能是正确的。这里的关键是“可能”。这些是标准库函数,因此可以具有不同的实现细节,因为标准定义了行为而不是如何实现。理论上,您可以找到与您的发现相反的标准库实现。
我想你想看看上一个问题的答案以获得完整的文章:Efficient string concatenation in C++