Lembrei-me de ler sobre isso no padrão, então aqui vai:
Consulte o padrão C11, que define como os fluxos padrão se comportam. Como os programas C ++ fazem interface com a CRT, o padrão C11 deve governar a política de liberação aqui.
ISO / IEC 9899: 201x
7.21.3 §7
Na inicialização do programa, três fluxos de texto são predefinidos e não precisam ser abertos explicitamente - entrada padrão (para leitura de entrada convencional), saída padrão (para gravação de saída convencional) e erro padrão (para gravação de saída de diagnóstico). Como aberto inicialmente, o fluxo de erro padrão não é totalmente armazenado em buffer; os fluxos de entrada e saída padrão são totalmente armazenados em buffer se, e somente se, o fluxo puder ser determinado para não se referir a um dispositivo interativo.
7.21.3 §3
Quando um fluxo não é armazenado em buffer, os caracteres devem aparecer da origem ou do destino o mais rápido possível. Caso contrário, os caracteres podem ser acumulados e transmitidos para ou do ambiente host como um bloco. Quando um fluxo é totalmente armazenado em buffer, os caracteres devem ser transmitidos para ou a partir do ambiente host como um bloco quando um buffer é preenchido. Quando um fluxo é buffer de linha, os caracteres devem ser transmitidos para ou do ambiente host como um bloco quando um caractere de nova linha é encontrado. Além disso, os caracteres devem ser transmitidos como um bloco para o ambiente host quando um buffer é preenchido, quando a entrada é solicitada em um fluxo sem buffer ou quando a entrada é solicitada em um fluxo com buffer de linha que requer a transmissão de caracteres do ambiente host. .
Isso significa que std::cout
e std::cin
são totalmente armazenados em buffer se, e somente se , estiverem se referindo a um dispositivo não interativo. Em outras palavras, se stdout estiver conectado a um terminal, não haverá diferença no comportamento.
No entanto, se std::cout.sync_with_stdio(false)
for chamado, '\n'
não causará descarga mesmo em dispositivos interativos. Caso contrário, '\n'
é equivalente a std::endl
menos que o canal seja feito para os arquivos: c ++ ref on std :: endl .