4

我正在用 C++ 编码。让我们成为一些字符串。我被要求确定以下哪个更快:

cout << "s:"  + s  + "s:"  + s  + " s:"  + s  + "\n";

cout << "s:" << s << "s:" << s << " s:" << s << "\n";

我反复运行它们,发现第二个更快。我花了一段时间试图找出原因。我认为这是因为在第一个中,字符串首先连接然后输出到屏幕。但第二个只是直接输出到屏幕上。那是对的吗?

4

4 回答 4

4

第一个可能涉及为字符串连接分配一些内存,然后将最终连接的字符串复制到输出缓冲区。第二个将简单地将已分配的字符串数据复制到已分配的输出缓冲区。

于 2012-11-13T03:11:52.073 回答
0

从理论的角度来看,第二个示例是线性时间,而第一个示例可以是二次时间(以子串的数量表示),具体取决于实现。

要确定您的实现是否属于这种情况,您必须查看源代码和(因为编译器可能会优化)机器代码。

简而言之,原因取决于实现,并且通常要确定“哪个最快”,您别无选择,只能MEASURE。“原因”可以作为启发式指南。但仅此而已:最终,衡量标准和现实才是最重要的。

于 2012-11-13T03:11:35.460 回答
0

由于第一个创建字符串对象,您认为第二个更快的假设可能是正确的。这里的关键是“可能”。这些是标准库函数,因此可以具有不同的实现细节,因为标准定义了行为而不是如何实现。理论上,您可以找到与您的发现相反的标准库实现。

于 2012-11-13T03:14:28.023 回答
0

我想你想看看上一个问题的答案以获得完整的文章:Efficient string concatenation in C++

于 2012-11-13T03:20:02.517 回答