Não tenho um contexto específico no qual estou fazendo a pergunta, mas enquanto estava lendo um livro para iniciantes em C ++, notei o uso de um manipulador de fluxo endl e de um caractere de escape de nova linha ao lidar com um objeto de fluxo.
O exemplo é o seguinte:
cout << "Hello World" << endl;
cout << "Hello World\n";
Minhas perguntas são:
- É mais apropriado usar o manipulador de fluxo (endl) em uma determinada situação e um caractere de escape em outra?
- Existem desvantagens em termos de eficiência em usar um dos dois?
- Eles são completamente intercambiáveis?
- Eu li que uma sequência de escape é armazenada na memória como um único caractere. Isso significa que é mais apropriado usar endl se você estiver consumindo pouco memória?
- O manipulador de fluxo acaba consumindo memória de alguma forma, se for, é mais do que a sequência de escape?
Obrigado, desculpas pelo StackExchange. Se eu postei isso na seção errada, achei que isso contaria como estruturas de dados.
c++
data-structures
Nathan Taylor
fonte
fonte
Respostas:
o << std::endl
é equivalente ao seguinte código:Em outras palavras, você deve usar somente
std::endl
quando precisar liberar o fluxo. Por exemplo:Se você não precisar liberar o fluxo, use em
\n
vez destd::endl
. As chamadas extras paraflush
podem prejudicar o desempenho (às vezes significativamente).Para mais detalhes, consulte cppreference.com .
Quanto ao uso da memória: Preocupar-se com o
\n
versusstd::endl
é quase certamente uma micro-otimização desnecessária, mas, em geral, eu esperaria\n
gastar menos memória.\n
é apenas mais um byte no final de uma string literal, enquanto a escritastd::endl
é traduzida pelo compilador em (provavelmente inline) chamadas de função paraput
eflush
.As diferenças específicas da plataforma nas terminações de linha (Windows
\r\n
versus Linux e OS X\n
) são tratadas em um nível mais baixo questd::endl
e\n
:\n
, ele o converterá automaticamente para o final de linha específico da plataforma apropriado. Se você ler um final de linha específico da plataforma, o fluxo o converterá automaticamente\n
.std::cout
estd::cin
, em particular, eles são tratados como se eles estão em modo texto.fonte
1) Para portabilidade, useEditar: conforme comentários, as terminações específicas do sistema de linha são tratadas em um nível inferior.endl
. As novas linhas do Windows são\r\n
Linux\n
e Mac\r
.2)
endl
libera o fluxo,"\n"
não.3) Depende da portabilidade.Quanto ao uso da memória, você pode minimizá-lo liberando para outro armazenamento o mais rápido possível
endl
. No entanto, isso diminuirá o desempenho.Edit: Esclarecer alguns erros.
fonte
\n
em qualquer máquina moderna.endl
e\n
são equivalentes em relação às terminações de linha específicas da plataforma; as diferenças de plataforma são tratadas em um nível inferior.End of line sequence
(assumindo o modo de texto). OEnd of line sequence
é convertido novamente em '\ n' quando lido de um arquivo. O ponto 3) é duvidoso. E o último parágrafo está novamente errado: liberar não economizará espaço e liberar mais do que o necessário reduzirá a velocidade do código (o objetivo do buffer é melhorar a eficiência da gravação em um dispositivo lento).