Utilizzo di un manipolatore di flusso (endl) o un carattere di escape di nuova riga (\ n)?

13

Non ho un contesto specifico in cui sto facendo la domanda, ma mentre stavo leggendo un libro per principianti su C ++ ho notato l'uso sia di un manipolatore di stream endl che di un carattere di escape di nuova riga quando si trattava di un flusso oggetto.

L'exmaple è la seguente:

cout << "Hello World" << endl;
cout << "Hello World\n";

Le mie domande sono:

  1. È più appropriato usare lo stream manipulator (endl) in un certo situazione e un personaggio di fuga in un altro?
  2. Ci sono degli svantaggi sull'uso di uno dei due?
  3. Sono completamente intercambiabili?
  4. Ho letto che una sequenza di escape è memorizzata come singolo carattere. Significa che è più appropriato usare endl se si sta utilizzando un consumo di memoria ridotto?
  5. Il manipolatore di flusso utilizza la memoria in qualsiasi modo, se è così più della sequenza di escape?

Grazie, StackExchange Mi scuso se ho postato questo nella sezione sbagliata, ho pensato che contasse come strutture dati.

    
posta Nathan Taylor 28.01.2013 - 16:26
fonte

2 risposte

13

o << std::endl è equivalente al seguente codice:

o.put(o.widen('\n'));
o.flush();

In altre parole, dovresti usare std::endl solo quando devi svuotare il flusso. Ad esempio:

  • Stai per eseguire un'operazione che richiede dispendio di tempo e vuoi assicurarti di visualizzare un messaggio prima di farlo.
  • Un altro processo è in attesa sul tuo output.
  • Se è in esecuzione più di un thread o processo, potrebbe essere necessario svuotare l'output in modo che l'output di ogni thread o processo venga visualizzato correttamente. (Altrimenti, potresti ottenere blocchi apparentemente casuali di output intercalati a intervalli imprevisti.)

Se non hai bisogno di per svuotare il flusso, usa \n invece di std::endl . Le chiamate extra a flush possono influire negativamente sulle prestazioni (a volte in modo significativo).

Per ulteriori dettagli, vedi cppreference.com .

Per quanto riguarda l'utilizzo della memoria: preoccuparsi di \n rispetto a std::endl è quasi certamente una micro-ottimizzazione non necessaria, ma in generale, mi aspetto che \n prenda meno memoria. \n è solo un altro byte alla fine di una stringa letterale, mentre la scrittura di std::endl è tradotta dal compilatore in chiamate di funzione (probabilmente in linea) a put e flush .

Le differenze specifiche della piattaforma nelle terminazioni di riga (Windows \r\n contro Linux e OS X \n ) vengono gestite a un livello inferiore rispetto a std::endl e \n :

  • Se uno stream viene aperto in modalità testo, quindi se scrivi \n , lo traduce automaticamente alla fine della linea specifica della piattaforma appropriata. Se leggi una fine specifica della piattaforma, lo stream la traduce automaticamente in \n .
  • Se un flusso viene aperto in modalità binaria, passano qualsiasi terminazione di riga in modo letterale, e dipende da te.
  • Per std::cout e std::cin in particolare, vengono trattati come se fossero in modalità testo.
risposta data 28.01.2013 - 17:18
fonte
1

1) Per la portabilità, usa endl . Le novità di Windows sono \r\n , Linux \n e Mac \r . Modifica: Come per i commenti, le terminazioni specifiche del sistema di riga vengono gestite a un livello inferiore.

2) endl svuota il flusso, "\n" no.

3) Dipende dalla portabilità.

Per quanto riguarda l'utilizzo della memoria, puoi ridurlo al minimo eseguendo il flushing su altri dispositivi di archiviazione il più spesso possibile con endl . Tuttavia, diminuirà le prestazioni.

Modifica: cancella alcuni errori.

    
risposta data 28.01.2013 - 16:42
fonte

Leggi altre domande sui tag