多次插入 (<<) 与连接输出 (+)
Multiple insertions (<<) vs concatenating output (+)
我想知道做之间有什么区别,例如,
void example1(ostream &out, string &name, string &title, int years) {
out << "Hello, my name is " << name << " and I have been working as a "
<< title << " for " << years << " years.\n";
}
并且
void example2(ostream &out, string &name, string &title, int years) {
out << "Hello, my name is " + name + " and I have been working as a "
+ title + " for " + to_string(years) + " years.\n";
}
example1调用了多次插入运算符,而example2在连接所有字符串后只调用了一次插入运算符。一个比另一个更安全或更高效?适用于 cout
的相同问题是否也适用于其他输出流,例如 ostringstream
?
换句话说,是像示例 1 中那样使用 <<
单独输出字符串数据更快 and/or 更可靠,还是像示例 2 中那样在将所有内容发送到输出之前连接所有内容?
这是我的示例代码的编译 "fiddle":https://gcc.godbolt.org/z/MPetxq
第一个版本只需要为每个涉及的类型重载 <<
。
第二个需要为每对出现的相关类型重载 +
并且还需要创建一个结果类型的对象,然后可以将其输出。诚然,<<
只需要为该结果类型重载。
根据重载的复杂程度,尤其是结果类型对象的创建,这些差异会对速度产生影响。
出于优化目的,始终需要进行测量而不是猜测。但我想我敢打赌不必为了速度而创建对象,也不必为了简单而进行多次重载。
我想知道做之间有什么区别,例如,
void example1(ostream &out, string &name, string &title, int years) {
out << "Hello, my name is " << name << " and I have been working as a "
<< title << " for " << years << " years.\n";
}
并且
void example2(ostream &out, string &name, string &title, int years) {
out << "Hello, my name is " + name + " and I have been working as a "
+ title + " for " + to_string(years) + " years.\n";
}
example1调用了多次插入运算符,而example2在连接所有字符串后只调用了一次插入运算符。一个比另一个更安全或更高效?适用于 cout
的相同问题是否也适用于其他输出流,例如 ostringstream
?
换句话说,是像示例 1 中那样使用 <<
单独输出字符串数据更快 and/or 更可靠,还是像示例 2 中那样在将所有内容发送到输出之前连接所有内容?
这是我的示例代码的编译 "fiddle":https://gcc.godbolt.org/z/MPetxq
第一个版本只需要为每个涉及的类型重载 <<
。
第二个需要为每对出现的相关类型重载 +
并且还需要创建一个结果类型的对象,然后可以将其输出。诚然,<<
只需要为该结果类型重载。
根据重载的复杂程度,尤其是结果类型对象的创建,这些差异会对速度产生影响。
出于优化目的,始终需要进行测量而不是猜测。但我想我敢打赌不必为了速度而创建对象,也不必为了简单而进行多次重载。