Akış manipülatörü (endl) veya yeni satır çıkış karakteri (\ n) mı kullanıyorsunuz?


12

Soruyu sorduğum belirli bir bağlam yok, ancak C ++ ile ilgili bir başlangıç ​​kitabı okurken, bir akış nesnesiyle uğraşırken hem bir endl akış manipülatörü hem de bir yeni satır kaçış karakterinin kullanımını fark ettim.

Örnek şu şekildedir:

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

Sorularım:

  1. Akış manipülatörünü (endl) belirli bir durumda ve bir kaçış karakterini farklı bir durumda kullanmak daha uygun mu?
  2. İkisinden birini kullanmanın akıllıca bir dezavantajı var mı?
  3. Tamamen değiştirilebilir mi?
  4. Bir kaçış dizisinin bellekte tek bir karakter olarak saklandığını okudum. Bu, düşük bellek tüketimi için endl kullanmanın daha uygun olduğu anlamına mı geliyor?
  5. Akış manipülatörü, bellek kaçış dizisinden daha fazla ise, herhangi bir şekilde bellek kullanıyor mu?

Teşekkürler, StackExchange Özür dilerim bu yanlış bölümde yayınladı, ben veri yapıları olarak sayılır düşündüm.


2
endl ayrıca bazı akışlarda kızarmaya neden olur, '\ n' yapmaz.
James

Yanıtlar:


12

o << std::endl aşağıdaki koda eşdeğerdir:

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

Başka bir deyişle, yalnızca std::endlakışı yıkamanız gerektiğinde kullanmalısınız . Örneğin:

  • Zaman alan bir işlem yapmak üzeresiniz ve bunu yapmadan önce bir mesaj görüntülediğinizden emin olmak istiyorsunuz.
  • Çıktınızda başka bir işlem bekliyor.
  • Birden fazla iş parçacığı veya işlem çalışıyorsa, her iş parçacığından veya işlemden elde edilen çıktının doğru görüntülenmesi için çıktıyı yıkamanız gerekebilir. (Aksi takdirde, garip aralıklarla rastgele görünen çıktı blokları arasına girebilirsiniz.)

Akışı yıkamanıza gerek yoksa , \nyerine kullanın std::endl. Ekstra çağrılar flushperformansa (bazen önemli ölçüde) zarar verebilir.

Daha fazla bilgi için, bkz. Cppreference.com .

İlgili hafıza kullanımı: endişesi \nkarşısında std::endlneredeyse kesinlikle gereksiz bir mikro optimizasyonu, ancak genel olarak, ben beklediğiniz \naz bellek almak. \nyazma sırasında dize sonunda sadece bir daha bayt olduğunu std::endl(muhtemelen inlined) içine derleyiciye fonksiyon çağrılarıyla çevrilmiştir putve flush.

Hat sonlara Platformu özgü farklılıklar (Windows \r\n, Linux ve OS X karşı \n) daha düşük seviyede ele alınır std::endlve \n:

  • Bir akış metin modunda açılırsa, yazarsanız \n, otomatik olarak uygun platforma özgü satır sonuna çevirir. Platforma özgü bir satır sonunu okursanız akış otomatik olarak bu düzeye dönüştürür \n.
  • Bir akış ikili modda açılırsa, herhangi bir satır sonunu kelimesi kelimesine iletir ve bu size bağlıdır.
  • İçin std::coutve std::cinözellikle de onlar davranılıyor onlar ediyoruz metin modu sanki.

1

1) Taşınabilirlik için kullanın endl. Windows satırları \r\nLinux \nve Mac'tir \r. Düzenleme: Yorumlara göre, hat sistemine özgü sonlar daha düşük bir seviyede ele alınır.

2) endlakımı yıkar, "\n"çıkarmaz.

3) Taşınabilirliğe bağlıdır.

Bellek kullanımına gelince, diğer depolama alanlarıyla mümkün olduğunca sık yıkayarak en aza indirebilirsiniz endl. Ancak, performansı düşürecektir.

Düzenleme: Bazı hataları silin.


2
Mac, OS X'ten beri unix tabanlıdır ve bu nedenle \nherhangi bir modern makinede de bulunmaktadır.

7
Üzgünüm, ama bu yanlış. endlve \nplatforma özgü satır sonlarıyla ilgili olarak eşdeğerdir; platform farkları daha düşük bir seviyede ele alınmaktadır.
Josh Kelley

2
İlk noktanız yanlış. endl () akışa '\ n' gönderir (akışa ek olarak). '\ N' karakteri platforma özgüdür End of line sequence(metin modunu varsayarak). End of line sequence'\ N' bir dosyadan okurken dönüştürülen geri döndü. Nokta 3) şüphelidir. Ve son paragraf yine yanlış: Yıkama, yerden tasarruf etmeyecek ve gerektiğinden fazla yıkama, kodunuzu yavaşlatacaktır (tamponun noktası, yavaş bir cihaza yazma verimliliğini artırmaktır).
Martin York
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.