“std::endl” vs “\n”

后端 未结 12 2418
耶瑟儿~
耶瑟儿~ 2020-11-21 04:35

Many C++ books contain example code like this...

std::cout << \"Test line\" << std::endl;

...so I\'ve always done that too. But

相关标签:
12条回答
  • 2020-11-21 05:20

    The difference can be illustrated by the following:

    std::cout << std::endl;
    

    is equivalent to

    std::cout << '\n' << std::flush;
    

    So,

    • Use std::endl If you want to force an immediate flush to the output.
    • Use \n if you are worried about performance (which is probably not the case if you are using the << operator).

    I use \n on most lines.
    Then use std::endl at the end of a paragraph (but that is just a habit and not usually necessary).

    Contrary to other claims, the \n character is mapped to the correct platform end of line sequence only if the stream is going to a file (std::cin and std::cout being special but still files (or file-like)).

    0 讨论(0)
  • 2020-11-21 05:27

    I've always had a habit of just using std::endl because it is easy for me to see.

    0 讨论(0)
  • 2020-11-21 05:27

    If you intend to run your program on anything else than your own laptop, never ever use the endl statement. Especially if you are writing a lot of short lines or as I have often seen single characters to a file. The use of endl is know to kill networked file systems like NFS.

    0 讨论(0)
  • 2020-11-21 05:27

    With reference This is an output-only I/O manipulator.

    std::endl Inserts a newline character into the output sequence os and flushes it as if by calling os.put(os.widen('\n')) followed by os.flush().

    When to use:

    This manipulator may be used to produce a line of output immediately,

    e.g.

    when displaying output from a long-running process, logging activity of multiple threads or logging activity of a program that may crash unexpectedly.

    Also

    An explicit flush of std::cout is also necessary before a call to std::system, if the spawned process performs any screen I/O. In most other usual interactive I/O scenarios, std::endl is redundant when used with std::cout because any input from std::cin, output to std::cerr, or program termination forces a call to std::cout.flush(). Use of std::endl in place of '\n', encouraged by some sources, may significantly degrade output performance.

    0 讨论(0)
  • 2020-11-21 05:28

    Not a big deal, but endl won't work in boost::lambda.

    (cout<<_1<<endl)(3); //error
    
    (cout<<_1<<"\n")(3); //OK , prints 3
    
    0 讨论(0)
  • 2020-11-21 05:33

    I recalled reading about this in the standard, so here goes:

    See C11 standard which defines how the standard streams behave, as C++ programs interface the CRT, the C11 standard should govern the flushing policy here.

    ISO/IEC 9899:201x

    7.21.3 §7

    At program startup, three text streams are predefined and need not be opened explicitly — standard input (for reading conventional input), standard output (for writing conventional output), and standard error (for writing diagnostic output). As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.

    7.21.3 §3

    When a stream is unbuffered, characters are intended to appear from the source or at the destination as soon as possible. Otherwise characters may be accumulated and transmitted to or from the host environment as a block. When a stream is fully buffered, characters are intended to be transmitted to or from the host environment as a block when a buffer is filled. When a stream is line buffered, characters are intended to be transmitted to or from the host environment as a block when a new-line character is encountered. Furthermore, characters are intended to be transmitted as a block to the host environment when a buffer is filled, when input is requested on an unbuffered stream, or when input is requested on a line buffered stream that requires the transmission of characters from the host environment. Support for these characteristics is implementation-defined, and may be affected via the setbuf and setvbuf functions.

    This means that std::cout and std::cin are fully buffered if and only if they are referring to a non-interactive device. In other words, if stdout is attached to a terminal then there is no difference in behavior.

    However, if std::cout.sync_with_stdio(false) is called, then '\n' will not cause a flush even to interactive devices. Otherwise '\n' is equivalent to std::endl unless piping to files: c++ ref on std::endl.

    0 讨论(0)
提交回复
热议问题