ti-enxame.com

O que significa liberar o buffer?

Estou aprendendo C++ e encontrei algo que não consigo entender:

Os buffers de saída podem ser explicitamente liberados para forçar a gravação do buffer. Por padrão, a leitura de cin libera cout; cout também é liberado quando o programa termina normalmente.

Então, liberando o buffer (por exemplo, um buffer de saída): isso limpa o buffer excluindo tudo nele ou limpa o buffer emitindo tudo nele? Ou liberar o buffer significa algo completamente diferente?

82
Mohamed Ahmed Nabil

Considere gravar em um arquivo. Esta é uma operação cara. Se no seu código você escreve um byte de cada vez, cada gravação de um byte será muito cara. Portanto, uma maneira comum de melhorar o desempenho é armazenar os dados que você está gravando em um buffer temporário. Somente quando há muitos dados, o buffer é gravado no arquivo. Adiando as gravações e gravando um bloco grande de uma só vez, o desempenho é aprimorado.

Com isso em mente, liberar o buffer é o ato de transferir os dados do buffer para o arquivo.

Isso limpa o buffer excluindo tudo nele ou limpa o buffer produzindo tudo nele?

O último.

98
David Heffernan

Você citou a resposta:

Os buffers de saída podem ser explicitamente liberados para forçar a gravação do buffer.

Ou seja, pode ser necessário "liberar" a saída para que ela seja gravada no fluxo subjacente (que pode ser um arquivo ou, nos exemplos listados, um terminal).

Geralmente, stdout/cout é buffer de linha: a saída não é enviada ao sistema operacional até você escrever uma nova linha ou liberar explicitamente o buffer. A vantagem é que algo como std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl causa apenas uma gravação no "arquivo" subjacente em vez de seis, o que é muito melhor para o desempenho. A desvantagem é que um código como:

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

std::cout << "\n";

produzirá ..... de uma só vez (para a implementação exata de sleep, consulte esta pergunta ). Nesses casos, você desejará um << std::flush adicional para garantir que a saída seja exibida.

A leitura de cin libera cout para que você não precise de uma liberação explícita para fazer isso:

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

Limpe o buffer produzindo tudo.

3
Alex Chamberlain