I was listening to a google talk by Andrei Alexandrescu on the D programming language when he threw out a one liner about the "endl" fiasco. I just thought endl was the preferred way to signify the end of a line and flush the buffer for a stream. Why is it considered a fiasco? Should I not be using it in my code?
(I assume) He just means that many, especially new, C++ programmers use std::endl
blindly instead of '\n'
for newline, flushing unnecessarily frequently and potentially making the performance of their program abysmal.
I.e., most people are taught that std::endl
is the canonical way to insert a newline into a stream even though it is very rarely necessary or appropriate to flush it.
It is some people's opinion (*cough*) that std::endl
shouldn't even be in the standard, as it is so rarely appropriate and not a significant typing savings over '\n' << std::flush
anyway.
TL;DR(s):
- In the end,
std::endl
buys you nothing except usually worse performance and usually more typing. - It has its uses, but they are considerably rarer than its frequency of use in most large codebases would suggest, therefore...
- Its utility is highly questionable and its ubiquity is absurd – a fiasco indeed!
\n
is the newline in C, and that \n
->platform specific line terminator conversion is handled by the stream. –
Tirrell std::endl
, then people would be taught to use '\n'
from the beginning, and as '\n'
is shorter to type then std::endl
(and the same as endl
) I would say it's simple to use too. :-] In the end, std::endl
buys you nothing except worse performance and usually more typing. –
Antisyphilitic std::endl
is a premature pessimization more-so than using '\n'
is a premature optimization. –
Antisyphilitic endl
; however, most people who use endl
do not need flushing. –
Antisyphilitic std::endl
flush anyway, when we have std::flush
? –
Osugi To add to the already great answer, this issue can be extended to the 'iostream' fiasco.
Using iostream in general has a performance penalty because it is designed to be synced up with the stdio streams (printf
and scanf
) so that you can use a mix of isotream and stdio if so desired.
If you are only going to be using one you can get a performance benefit by calling std::ios::sync_with_stdio(false)
. I believe, however, the unsynced streams are no longer thread safe...
© 2022 - 2024 — McMap. All rights reserved.
std::endl
for everything rather than\n
, which I agree is rather strange. But then again, we're just writing simple console programs. But then again again, he seems to think initializing a (POD) variable in a loop is a potential performance issue... – Embowed