Cela fait maintenant de nombreuses années que j'ai arrêté d'utiliser std::endl
pour terminer les lignes lors de l'écriture sur std::cout
et a commencé à utiliser "\n"
à la place.
Mais maintenant je commence à voir plus de bouts de code utilisant '\n'
à la place, et j'ai commencé à me demander ce qui pourrait être le mieux.
Outre le fait évident que l'un est une chaîne de caractères et l'autre un caractère, y a-t-il un avantage à utiliser cette méthode ?
std::cout << variable << '\n';
Par-dessus tout ça :
std::cout << variable << "\n";
Ajout tardif :
Lorsque j'ai posé cette question, il semblait penser que la nouvelle ligne '\n'
a vidé le tampon. Maintenant, je sais qu'il dépend de .
Par défaut std::cin
est lié à l'ancien C stdin
FILE*
et std::cout
est lié à stdout
. Le flushing sur newline provient de cette liaison. Par défaut stdout
si elle est connectée à un terminal, est tamponnée en ligne. Cela signifie qu'une nouvelle ligne va vider ses tampons. Ainsi, lorsque vous imprimez une nouvelle ligne en utilisant std::cout
qui conduira à stdout
en cours de rinçage.
Si stdout
n'est pas connecté à un terminal (par exemple la sortie a été redirigée ou est canalisée), ou si le lien entre std::cout
y stdout
est cassé, alors les nouvelles lignes n'effaceront rien.
1 votes
Question intéressante, j'aimerais aussi voir une réponse à cette question :) Par ailleurs, pourquoi avez-vous cessé d'utiliser
std::endl
?0 votes
@Constantinius stackoverflow.com/questions/213907/c-stdendl-vs-n
1 votes
@Constantinius J'ai arrêté avec
using namespace std
ystd::endl
Il y avait trop de choses à écrire. :)0 votes
@alex vasi, Joachim Pileborg : merci, c'est bon à savoir.
0 votes
@constantinius : gcc.gnu.org/onlinedocs/libstdc++/manuel/bk01pt11ch25s02.html
0 votes
Il peut y avoir une légère différence de performances entre les deux (mais je ne saurais dire laquelle est la plus rapide), mais comme vous effectuez déjà des E/S (lentes), cela n'a guère d'importance. Et
'\n'
serait probablement meilleure dans un environnement où la mémoire est très limitée, mais il est peu probable que vous utilisiez std::anything dans un tel cas.5 votes
@Joachim : Vous avez arrêté de l'utiliser pour de mauvaises raisons, mais au moins vous avez arrêté de l'utiliser. ;)
8 votes
Votre montage est trompeur.
std::endl
es documenté pour vider les flux tamponnés. "La plupart des implémentations semblent flushées" est une autre façon de dire "J'ai eu de la chance jusqu'à présent" -- mais pour être juste, cela n'a d'importance que si vous vous souciez des délais de flush (ce qui est très très rare IMHO).0 votes
@HotLicks : ça peut être très important, voir l'article que j'ai mis en lien en ma réponse .
0 votes
Est-ce que la plupart des implémentations se rincent
std::out
sur la nouvelle ligne même lorsqu'il écrit dans un fichier, ou bien détectent-ils qu'il s'agit d'un terminal et agissent en conséquence ?