Comment puis-je découvrir / contrôler le niveau de mise en mémoire tampon interne dans un fstream C ++?

StackOverflow https://stackoverflow.com/questions/351582

  •  20-08-2019
  •  | 
  •  

Question

Dites que je fais cela (exemple artificiel):

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream ifs(argv[1]);

    char ch;
    while(ifs.read(&ch, 1)) {
        cout << ch;
    }
}

Je suppose (j'espère) que la bibliothèque iostream effectue une mise en mémoire tampon interne ici et ne la transforme pas en un ensemble d'opérations de lecture de fichier sur un octet au niveau du système d'exploitation.

Existe-t-il un moyen de:

a) Déterminer la taille de la mémoire tampon interne de ifstream?

b) Modification de la taille de la mémoire tampon interne de ifstream?

J'écris un filtre de fichier qui doit lire des fichiers de plusieurs gigaoctets par petits morceaux et j'aimerais tester différentes tailles de mémoire tampon pour voir si cela affecte les performances.

Était-ce utile?

La solution

Vous pouvez utiliser ios::rdbuf() pour obtenir un pointeur sur un objet streambuf. Cet objet représente le tampon interne du flux.

Vous pouvez appeler streambuf::pubsetbuf(char * s, streamsize n) pour définir un nouveau tampon interne d'une taille donnée.

Voir ce lien pour plus de détails.

modifier: voici à quoi cela ressemblerait dans votre cas:


#include <iostream>
#include <fstream>
using namespace std;

int main(int argCount, char ** argList[])
{
    ifstream inStream(argList[1]);

    char myBuffer [512];
    inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));

    char ch;
    while(inStream.read(&ch, 1))
    {
        cout << ch;
    }
}

modifier: comme indiqué par litb , le comportement réel de streambuf::pubsetbuf est le suivant: " défini par l'implémentation ".

Si vous voulez vraiment jouer avec les tampons, vous devrez peut-être lancer votre propre classe de mise en mémoire tampon qui hérite de <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top