Je n'ai pas de contexte spécifique dans lequel je pose la question, mais pendant que je lisais un livre pour débutants sur C ++, j'ai remarqué l'utilisation à la fois d'un manipulateur de flux endl et d'un caractère d'échappement newline lors du traitement d'un objet stream.
L'exmaple est le suivant:
cout << "Hello World" << endl;
cout << "Hello World\n";
Mes questions sont:
- Est-il plus approprié d'utiliser le manipulateur de flux (endl) dans une certaine situation et un caractère d'échappement dans une autre?
- Y a-t-il des inconvénients en termes d'efficacité à utiliser l'un des deux?
- Sont-ils complètement interchangeables?
- J'ai lu qu'une séquence d'échappement est stockée en mémoire comme un seul caractère. Cela signifie-t-il qu'il est plus approprié d'utiliser endl si vous optez pour une faible consommation de mémoire?
- Le manipulateur de flux utilise-t-il la mémoire de quelque façon que ce soit, si c'est plus que la séquence d'échappement?
Merci, StackExchange Excuses si j'ai posté ceci dans la mauvaise section, je pensais que cela comptait comme des structures de données.
c++
data-structures
Nathan Taylor
la source
la source
Réponses:
o << std::endl
est équivalent au code suivant:En d'autres termes, vous ne devez l'utiliser que
std::endl
lorsque vous devez vider le flux. Par exemple:Si vous n'avez pas besoin de vider le flux, utilisez
\n
plutôt au lieu destd::endl
. Les appels supplémentaires àflush
peuvent nuire aux performances (parfois de manière significative).Pour plus de détails, voir cppreference.com .
En ce qui concerne l'utilisation de la mémoire: s'inquiéter de
\n
versusstd::endl
est presque certainement une micro-optimisation inutile, mais en général, je m'attends\n
à consommer moins de mémoire.\n
n'est qu'un octet de plus à la fin d'un littéral de chaîne, tandis que l'écriturestd::endl
est traduite par le compilateur en appels de fonction (probablement en ligne) àput
etflush
.Les différences spécifiques à la plate-forme dans les fins de ligne (Windows
\r\n
par rapport à Linux et OS X\n
) sont traitées à un niveau inférieur àstd::endl
et\n
:\n
, il le traduit automatiquement en la fin de ligne spécifique à la plate-forme appropriée. Si vous lisez une fin de ligne spécifique à la plate-forme, le flux la traduit automatiquement\n
.std::cout
etstd::cin
en particulier, ils sont traités comme s'ils étaient en mode texte.la source
1) Pour la portabilité, utilisezModifier: selon les commentaires, les terminaisons spécifiques au système de ligne sont traitées à un niveau inférieur.endl
. Les nouveautés Windows sont\r\n
, Linux\n
et Mac\r
.2)
endl
rince le flux,"\n"
non.3) Dépend de la portabilité.En ce qui concerne l'utilisation de la mémoire, vous pouvez la minimiser en vidant vers un autre stockage aussi souvent que possible avec
endl
. Cependant, cela diminuera les performances.Edit: Éliminez certaines erreurs.
la source
\n
sur n'importe quelle machine moderne.endl
et\n
sont équivalents en ce qui concerne les fins de ligne spécifiques à la plate-forme; les différences de plate-forme sont traitées à un niveau inférieur.End of line sequence
(en supposant le mode texte). LeEnd of line sequence
est reconverti en «\ n» lors de la lecture d'un fichier. Le point 3) est douteux. Et le dernier paragraphe est à nouveau faux: le rinçage ne vous fera pas économiser d'espace et le rinçage plus que nécessaire ralentira votre code (le but du tampon est d'améliorer l'efficacité d'écriture sur un périphérique lent).