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