Pourquoi y a-t-il istream et ostream en C++ puisqu’il y a iostream ?


La question telle qu'elle a été posée à l'origine était :

Pourquoi y a-t-il istream et ostream en C++ puisqu'il y a iostream ?


Je prends cette question dans le sens suivant : "pourquoi n'est-il pas suffisant pour la norme d'avoir l'en-tête ? Pourquoi avons-nous également besoin des deux sous-parties, et ?"

Je vais préfacer ma réponse en disant que les raisons réelles ne sont pas nécessairement de bonnes raisons dans le monde d'aujourd'hui. La bibliothèque iostream est l'une des plus anciennes parties de la bibliothèque standard C++, et il y a beaucoup de choses à son sujet que les membres actuels du comité de normalisation C++ changeraient si nous pouvions recommencer. Cette mise en garde étant faite, il y a deux raisons principales pour avoir les trois en-têtes plutôt qu'un seul :

  1. Si vous n'avez besoin que d'un seul de istream ou ostream, alors cela ralentit votre compilation d'inclure les deux. iostream inclut les deux autres.
  2. Plus important encore, l'en-tête iostream déclare et initialise les flux standard, cout, cerr, clog, cin, et leurs équivalents à caractères larges. Cette initialisation apporte beaucoup de bagages (y compris le mécanisme de compteur délicat utilisé pour éviter les initialisations en double), et elle fait des ravages dans les bibliothèques partagées. Cela peut être contre-intuitif, mais ni istream ni ostream ne déclarent les flux standard.

Mon conseil typique est : Pour les programmes jouets, utilisez iostream. Pour les composants de programmes réels, préférez l'utilisation de istream, ostream, ou les deux, à moins que vous n'ayez besoin de vous référer à un flux standard par son nom.

EDIT : La modération de Quora ne cesse d'inverser le sens de cette question de sorte qu'elle n'a pas de sens. Quora moderation changed the question to:

Why isn’t there istream and ostream in C++ since there is iostream?

To which the correct answer is: There is. Always has been.