Différence entre std :: endl et (concernant la sensibilisation à la plate-forme)
Question
Avant de déclarer cette question comme un double de ce ou que, veuillez considérer que j'ai soumis un problème à le juge en ligne avec \n
et j'ai eu WA, et puis avec std::endl
et j'ai eu AC.J'ai donc besoin d'une réponse très précise sur le point de sensibilisation à la plateforme:Est \n
vraiment conscient de la plate-forme, et le runtime écrit-il vraiment la fin de ligne correcte en fonction de la plate-forme, comme le prétendent les réponses aux autres questions ?Si oui, pourriez-vous me dire comment cela s'est produit ??
Si la réponse peut être étayée par une citation de la norme concernant le problème de sensibilisation à la plate-forme, je serais vraiment reconnaissant.J'ai lu toutes les réponses des autres questions (même celles fermées), alors s'il vous plaît, ne répétez pas la chose "vider le tampon".
La solution
Depuis C++11
, §27.7.3.8
-
namespace std
{
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}
Effets : Appelle os.put(os.widen(’ ’)), puis os.flush().
Renvoie : os.
Donc, d'après la norme, il est clair que endl
vide le tampon du flux de sortie, tandis que \n
n'a pas.En général, vous souhaiterez utiliser endl
pour imprimer une nouvelle ligne, mais vous devez également garder à l'esprit qu'à chaque fois que vous faites cela, le tampon de sortie sera également vidé.
À propos de la notoriété de la plateforme
D'après la norme, il est évident que les deux font exactement la même chose : imprimer une nouvelle ligne exactement de la même manière.Ainsi, si l’un est indépendant de la plate-forme, l’autre devrait également être le même.Puisque je sais avec certitude endl
est indépendant de la plate-forme, il devrait en être de même pour \n
.
Autres conseils
std::endl
est un manipulateur qui produit '\n'
, puis vide le flux.Pour une utilisation la plus occasionnelle, c’est ce que vous devriez utiliser.Cependant, lors de la sortie de gros volumes de données, cela peut entraîner une baisse significative des performances, auquel cas, utilisez '\n'
.
MODIFIER:
En ce qui concerne la notoriété de la plateforme :les deux produisent exactement la même chose.Si le flux a été ouvert en mode texte, le '\n'
entraînera l'apparition d'une représentation dépendante de la plate-forme d'une fin de ligne :0x0A sous Unix, 0x0D, 0x0A sous Windows, démarrer un nouvel enregistrement sous certains mainframes, etc.Si le flux a été ouvert en mode binaire, un seul octet (généralement 0x0A, mais cela dépend en fait du codage de caractères de base utilisé) sera généré.