使用流操纵器(endl)还是换行符(\ n)?


12

我没有在特定的上下文中询问问题,但是在阅读有关C ++的初学者书籍时,我注意到在处理流对象时,既使用了endl流操纵器,也使用了换行符。

示例如下:

cout << "Hello World" << endl;
cout << "Hello World\n";

我的问题是:

  1. 在特定情况下使用流操纵器(endl)并在其他情况下使用转义符是否更合适?
  2. 使用两者之一是否在效率方面存在弊端?
  3. 它们完全可以互换吗?
  4. 我读到一个转义序列作为单个字符存储在内存中。这是否意味着如果要降低内存消耗,使用endl更合适吗?
  5. 流操纵器endl是否以任何方式消耗内存,如果超过了转义序列,它会占用更多内存吗?

谢谢,StackExchange Apologies如果将其发布在错误的部分,我认为它已被视为数据结构。


2
endl还会对某些流进行刷新,而'\ n'不会。
詹姆斯

Answers:


12

o << std::endl 等效于以下代码:

o.put(o.widen('\n'));
o.flush();

换句话说,只应std::endl在需要刷新流时使用。例如:

  • 您将要执行耗时的操作,并希望确保在显示消息之前先进行显示。
  • 另一个过程正在等待您的输出。
  • 如果正在运行多个线程或进程,则可能需要刷新输出,以便正确显示每个线程或进程的输出。(否则,您可能会以尴尬的间隔插入看似随机的输出块。)

如果您不需要冲洗流,请使用\n代替std::endl。额外拨打电话可能flush会损害性能(有时会严重影响)。

有关更多详细信息,请参见cppreference.com

关于内存使用情况:担心\nvs std::endl几乎可以肯定是不必要的微优化,但总的来说,我希望\n占用更少的内存。 \n只是在字符串文字末尾多了一个字节,而std::endl编译器将写入操作转换为(可能是内联的)对put和的函数调用flush

特定于平台的行尾差异(Windows \r\n,Linux和OS X \n)的处理级别低于std::endl\n

  • 如果以文本模式打开流,那么如果您编写\n,它将自动将其转换为适当的平台特定的行尾。如果您阅读了特定于平台的行尾,流将自动将其转换为\n
  • 如果以二进制模式打开流,则它们将逐行传递任何行尾,这取决于您。
  • 对于std::coutstd::cin特别,它们会被视为如果他们是文本模式。

1

1)为了便于携带,请使用endl。Windows换行是\r\nLinux \n和Mac \r 编辑:根据注释,特定于线路系统的结尾在较低级别处理。

2)endl冲洗流,"\n"不冲洗。

3)取决于便携性。

关于内存使用情况,您可以使用尽可能频繁地刷新到其他存储设备,以将其最小化endl。但是,它将降低性能。

编辑:清除一些错误。


2
自OS X以来,Mac一直基于Unix,因此也可以\n在任何现代机器上使用。

7
抱歉,但这是不正确的。 endl并且\n在特定于平台的行尾方面是等效的;平台差异将在较低级别上处理。
2013年

2
您的第一点是错误的。endl()向流发送“ \ n”(除了刷新它)。'\ n'字符将转换为特定于平台的字符End of line sequence(假定为文本模式)。该End of line sequence转换回“\ N`从文件中读取时。点3)令人怀疑。最后一段又是错误的:刷新将不会为您节省空间,而刷新会超出所需空间,这会使代码变慢(缓冲区的目的是提高对慢速设备的写入效率)。
马丁·约克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.