endl sau caracterul de linie nouă în C++
Separă trecerea la linia următoare de golirea bufferului de ieșire. Alege afișarea potrivită pentru volume mari și interacțiune cu utilizatorul.
În acest material
std::endl introduce un caracter de linie nouă și cere golirea bufferului fluxului. Caracterul \n introduce linia nouă fără să ceară el însuși aceeași operație explicită de golire. Diferența poate conta când afișezi foarte multe linii.
Ce este un buffer
Un buffer este o zonă în care datele sunt adunate temporar înainte de a fi trimise mai departe. Gruparea mai multor caractere într-o operație de ieșire poate reduce costurile față de trimiterea lor în foarte multe operații mici.
Golirea bufferului, numită flush, cere transmiterea datelor acumulate către destinația controlată de flux. Nu înseamnă că orice dispozitiv extern a terminat toate operațiile fizice posibile. Pentru alegerea afișării obișnuite, important este că flush impune un pas suplimentar de sincronizare a ieșirii.
Când linia nouă este suficientă
Într-o problemă care cere mii de linii și nu este interactivă, de obicei ai nevoie doar de separatorul de linie. Folosirea lui endl pentru fiecare linie poate introduce goliri repetate care nu ajută rezultatul cerut.
Nu modifica formatul ieșirii pentru a optimiza: păstrează exact spațiile și liniile cerute. Schimbi mecanismul inutil de golire, nu structura răspunsului. Evită și afișările de depanare rămase în programul trimis evaluatorului.
Caracterul de linie nouă separă liniile. endl separă liniile și cere și golirea bufferului, adică transmiterea datelor acumulate.Mărește schema ↗
Interacțiunea poate cere flush
Dacă programul trimite o întrebare și așteaptă un răspuns de la un alt proces, ieșirea trebuie să ajungă la acel proces la momentul potrivit. În asemenea contracte interactive, o golire explicită poate fi necesară. Nu aplica mecanic regula „endl este întotdeauna greșit”.
Legarea fluxurilor și setările de sincronizare pot influența momentul golirilor. Dacă schimbi configurarea intrării și ieșirii, înțelege și efectele asupra interacțiunii. O optimizare pentru un fișier mare nu este automat potrivită pentru un protocol interactiv.
Măsoară aceeași sarcină
Compară variantele pe același volum de date și aceeași destinație. Afișarea într-un terminal poate avea alte costuri decât redirecționarea într-un fișier. Un timp observat o singură dată nu dovedește un factor universal de accelerare.
Înainte de microoptimizări, verifică dacă algoritmul produce un număr rezonabil de operații și dacă volumul de ieșire este inevitabil. Un algoritm pătratic nu devine liniar prin schimbarea separatorului de linie.
Revezi cin și cout, fișierele text și complexitatea algoritmilor.
Întrebări frecvente
Care este diferența dintre endl și linia nouă în C++?
std::endl scrie un caracter de linie nouă și cere golirea bufferului. Caracterul \n scrie linia nouă fără să solicite el însuși acea golire explicită.
De ce poate fi endl mai lent la multe afișări?
Golirile repetate pot împiedica gruparea eficientă a ieșirii în buffer. Diferența depinde de mediu și volum; măsoară pe date relevante dacă afișarea este o parte importantă a timpului.
Când este necesară golirea explicită a fluxului?
Când programul trebuie să trimită imediat datele, de exemplu într-un protocol interactiv înainte de a aștepta răspunsul. Pentru ieșire obișnuită în lot, o golire la fiecare linie este adesea inutilă.