128 votes

Que signifie "vider la mémoire tampon" ?

J'apprends le C++ et j'ai trouvé quelque chose que je n'arrive pas à comprendre :

Les tampons de sortie peuvent être explicitement vidés afin de forcer le tampon à être écrit. Par défaut, la lecture cin chasse d'eau cout ; cout est également évacué lorsque le programme se termine normalement.

Donc, vider le tampon (par exemple un tampon de sortie) : est-ce que cela vide le tampon en supprimant tout ce qu'il contient ou est-ce que cela vide le tampon en sortant tout ce qu'il contient ? Ou encore, le fait de vider le tampon a-t-il une signification complètement différente ?

162voto

David Heffernan Points 292687

Pensez à écrire dans un fichier. Il s'agit d'une opération coûteuse. Si, dans votre code, vous écrivez un octet à la fois, chaque écriture d'un octet sera très coûteuse. Un moyen courant d'améliorer les performances consiste donc à stocker les données que vous écrivez dans une mémoire tampon temporaire. Ce n'est que lorsqu'il y a beaucoup de données que la mémoire tampon est écrite dans le fichier. En reportant les écritures et en écrivant un gros bloc en une seule fois, les performances sont améliorées.

Dans cette optique, le vidage du tampon consiste à transférer les données du tampon vers le fichier.

Est-ce que cela vide le tampon en supprimant tout ce qu'il contient ou est-ce que cela vide le tampon en sortant tout ce qu'il contient ?

Ce dernier.

29voto

tc. Points 23958

Vous avez cité la réponse :

Les tampons de sortie peuvent être explicitement vidés pour forcer l'écriture du tampon.

C'est-à-dire que vous pouvez avoir besoin de "flush" la sortie pour qu'elle soit écrite dans le flux sous-jacent (qui peut être un fichier, ou dans les exemples cités, un terminal).

En général, stdout/cout est un tampon de ligne : la sortie n'est pas envoyée au système d'exploitation tant que vous n'avez pas écrit une nouvelle ligne ou explicitement vidé le tampon. L'avantage est que quelque chose comme std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl n'entraîne qu'une seule écriture dans le "fichier" sous-jacent au lieu de six, ce qui est bien meilleur pour les performances. L'inconvénient est qu'un code comme :

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

produira ..... à la fois (pour des sleep la mise en œuvre, voir cette question ). Dans ce cas, vous voudrez disposer d'un << std::flush pour s'assurer que la sortie s'affiche.

Lecture cin chasse d'eau cout donc vous n'avez pas besoin d'un flush explicite pour le faire :

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;

6voto

Alex Chamberlain Points 2851

Vide le tampon en sortant tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X