在使用C++编码时,我经常会在cout
语句的末尾添加一个换行符(\n
)。然而,我的直觉一直是将这个换行符表示为字符串字面值:"\n"
,即使它只是一个单字符,可以更有效地表示为字符字面值('\n'
)。
cout << "The value of var is " << var << "\n";
有很多代码都存在这种现象。因此,问题如下:
两种不同的表达换行符常量的方式,在效率上是否有任何差异?我并不关心在生成的程序执行方面是否会产生任何实际区别(我猜这是微不足道的);而是担心可能会因无故丢失一些效率,即使是微小的。
如果字符串字面值版本的效率较低,编译器是否会将其优化为字符常量版本,因为两者提供了完全相同的行为?
我还熟悉
std::endl
。文档说:“这个操作符常常被误用,当需要一个简单的换行时,导致缓冲性能变差。” 并指向这篇文章以获取更多信息。然而,该文章指出,“性能差”仅适用于文件 I/O,并且使用endl
写入屏幕实际上可能会提高性能。这是怎么回事?
我搜索了 C++ 标准库,但找不到相关重载 <<
运算符的实现。我在 ostream.tcc
中找到了声明:
extern template ostream& operator<<(ostream&, char);
extern template ostream& operator<<(ostream&, const char*);
但是没有线索表明实现中的机制如何简化。
这更多是一个理论问题,所以我不感兴趣阅读“两者之间没有实际区别”。我知道。我只是想知道是否有任何区别以及编译器如何处理它。
const char[2]
的字符,如何将其 优化 为单个字符?此外,您的第三个问题似乎与此无关,可能应该作为单独的问题发布。 - Praetorian'\n'
和"\n"
是不同的,通常情况下后者不能被优化为前者。但是,cout << '\n'
和cout << "\n"
具有完全相同的行为,编译器可以利用其对cout
和重载的<<
运算符的了解来将一个转换为另一个。是否有任何编译器真正这样做是另一个问题。 - Keith Thompson