ใช้โปรแกรมจัดการกระแสข้อมูล (endl) หรืออักขระขึ้นบรรทัดใหม่ (\ n) หรือไม่


12

ฉันไม่มีบริบทที่เฉพาะเจาะจงที่ฉันถามคำถาม แต่ในขณะที่ฉันกำลังอ่านหนังสือเริ่มต้นบน C ++ ฉันสังเกตเห็นการใช้ทั้งตัวจัดการกระแสข้อมูล endl และตัวอักขระขึ้นบรรทัดใหม่เมื่อจัดการกับวัตถุกระแส

exmaple เป็นดังนี้:

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

คำถามของฉันคือ:

  1. มันเหมาะสมกว่าหรือไม่ที่จะใช้ stream manipulator (endl) ในบางสถานการณ์และตัวหนีในอีกอันหนึ่ง?
  2. มีข้อเสียประสิทธิภาพในการใช้หนึ่งในสองหรือไม่?
  3. พวกเขาใช้แทนกันได้อย่างสมบูรณ์หรือไม่
  4. ฉันอ่านว่า escape sequence ถูกเก็บไว้ในหน่วยความจำเป็นตัวอักษรเดียว หมายความว่าเหมาะสมกว่าที่จะใช้ endl ถ้าคุณใช้หน่วยความจำน้อยหรือไม่
  5. stream manipulator endl ใช้หน่วยความจำในทางใดทางหนึ่งหรือไม่ถ้าเป็นเช่นนั้นมากกว่าลำดับ escape หรือไม่?

ขอบคุณ StackExchange ขอโทษถ้าฉันโพสต์สิ่งนี้ในส่วนที่ไม่ถูกต้องฉันคิดว่ามันนับเป็นโครงสร้างข้อมูล


2
endl ยังทำให้เกิดการฟลัชในสตรีมบางรายการ '\ n' ไม่ได้
James

คำตอบ:


12

o << std::endl เทียบเท่ากับรหัสต่อไปนี้:

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

กล่าวอีกนัยหนึ่งคุณควรใช้std::endlเมื่อคุณต้องการล้างกระแสข้อมูล ตัวอย่างเช่น:

  • คุณกำลังจะใช้เวลานานและต้องการให้แน่ใจว่าคุณแสดงข้อความก่อนที่จะทำเช่นนั้น
  • กระบวนการอื่นกำลังรอผลลัพธ์ของคุณ
  • หากมีมากกว่าหนึ่งเธรดหรือกระบวนการกำลังทำงานอยู่คุณอาจต้องล้างข้อมูลเอาต์พุตเพื่อให้ผลลัพธ์จากแต่ละเธรดหรือกระบวนการแสดงอย่างถูกต้อง (มิฉะนั้นคุณอาจได้รับบล็อกสุ่มของเอาต์พุตที่แทรกระหว่างช่วงเวลาที่น่าอึดอัดใจ)

หากคุณไม่ต้องการที่จะล้างกระแสแล้วใช้แทน\n std::endlการโทรเพิ่มเติมเพื่อflushสร้างความเสียหายต่อประสิทธิภาพ (บางครั้งก็สำคัญ)

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่cppreference.com

เกี่ยวกับการใช้งานหน่วยความจำ: ความกังวลเกี่ยว\nกับเมื่อเทียบกับstd::endlการเพิ่มประสิทธิภาพขนาดเล็กที่ไม่จำเป็น แต่โดยทั่วไปฉันคาดว่า\nจะใช้หน่วยความจำน้อยลง \nเป็นเพียงหนึ่งไบต์มากขึ้นในตอนท้ายของตัวอักษรสตริงในขณะที่เขียนstd::endlถูกแปลโดยคอมไพเลอร์ลง (อาจ inlined) โทรฟังก์ชั่นและputflush

ความแตกต่างเฉพาะแพลตฟอร์มในการสิ้นสุดบรรทัด (Windows \r\nกับ Linux และ OS X \n) ได้รับการจัดการในระดับที่ต่ำกว่าstd::endlและ\n:

  • หากมีการเปิดกระแสในโหมดข้อความถ้าคุณเขียน\nมันจะแปลโดยอัตโนมัติเป็นบรรทัดสิ้นสุดเฉพาะแพลตฟอร์มที่เหมาะสม \nถ้าคุณอ่านบรรทัดเฉพาะแพลตฟอร์มสิ้นสุดกระแสโดยอัตโนมัติแปลมัน
  • หากกระแสถูกเปิดในโหมดไบนารีแล้วพวกเขาจะผ่านปลายสายใด ๆ ผ่านคำต่อคำและมันก็ขึ้นอยู่กับคุณ
  • สำหรับstd::coutและstd::cinโดยเฉพาะอย่างยิ่งพวกเขากำลังได้รับการปฏิบัติราวกับว่าพวกเขากำลังโหมดข้อความ

1

1) endlสำหรับการพกพาใช้งาน การขึ้นบรรทัดใหม่ของ Windows \r\n, Linux \nและ \rMac แก้ไข: ตามความเห็นการจบเฉพาะของระบบบรรทัดได้รับการจัดการในระดับที่ต่ำกว่า

2) endlล้างกระแสข้อมูล"\n"ไม่

3) ขึ้นอยู่กับการพกพา

ในฐานะที่เป็นใช้หน่วยความจำคุณสามารถลดได้โดยการล้างเพื่อเก็บข้อมูลอื่น ๆ endlได้บ่อยเท่าที่เป็นไปได้ด้วย อย่างไรก็ตามมันจะลดประสิทธิภาพ

แก้ไข: แก้ไขข้อผิดพลาดบางอย่าง


2
Mac นั้นใช้ระบบปฏิบัติการยูนิกซ์มาตั้งแต่ OS X ดังนั้นจึงเป็น\nเครื่องที่ทันสมัย

7
ขออภัย แต่นี่ไม่ถูกต้อง endlและ\nเทียบเท่ากับการสิ้นสุดบรรทัดเฉพาะแพลตฟอร์ม ความแตกต่างของแพลตฟอร์มได้รับการจัดการในระดับที่ต่ำกว่า
Josh Kelley

2
จุดแรกของคุณผิด endl () ส่ง '\ n' ไปยังสตรีม (นอกเหนือจากการล้างข้อมูล) อักขระ '\ n' ถูกแปลงเป็นแพลตฟอร์มเฉพาะEnd of line sequence(สมมติว่าโหมดข้อความ) End of line sequenceจะถูกแปลงกลับไป '\ n` เมื่ออ่านจากไฟล์ จุดที่ 3) น่าสงสัย และย่อหน้าสุดท้ายนั้นผิดอีกครั้ง: การล้างข้อมูลจะไม่ประหยัดพื้นที่ของคุณและการล้างข้อมูลมากกว่าที่จำเป็นจะทำให้โค้ดของคุณช้าลง (จุดบัฟเฟอร์คือการปรับปรุงประสิทธิภาพการเขียนลงในอุปกรณ์ที่ช้า)
มาร์ตินยอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.