C ++ สมัยใหม่เป็นที่แพร่หลายมากขึ้นหรือไม่? [ปิด]


132

ตอนที่ฉันเรียน C ++ ครั้งแรกเมื่อ 6-7 ปีที่แล้วสิ่งที่เรียนโดยพื้นฐานคือ "C with Classes" std::vectorเป็นหัวข้อขั้นสูงอย่างแน่นอนสิ่งที่คุณสามารถเรียนรู้ได้หากคุณต้องการจริงๆ และแน่นอนว่าไม่มีใครบอกฉันว่าผู้ทำลายสามารถถูกควบคุมเพื่อช่วยจัดการความทรงจำ วันนี้ทุกที่ที่ฉันมองเห็น RAII และSFINAEและ STL และ Boost และ Modern C ++ แม้แต่คนที่เพิ่งเริ่มต้นใช้ภาษาก็ดูเหมือนจะได้รับการสอนแนวคิดเหล่านี้เกือบตั้งแต่วันที่ 1

คำถามของฉันคือเป็นเพียงเพราะฉันเห็น "ดีที่สุด" เท่านั้นนั่นคือคำถามที่นี่ใน SO และในไซต์การเขียนโปรแกรมอื่น ๆ ที่มักจะดึงดูดผู้เริ่มต้น (gamedev.net) หรือนี่เป็นตัวแทนของ ชุมชน C ++ โดยรวม?

C ++ สมัยใหม่กลายเป็นค่าเริ่มต้นจริงหรือ? แทนที่จะเป็นสิ่งแปลกใหม่ที่ผู้เชี่ยวชาญเขียนถึงมันกลายเป็น "วิธีที่ C ++ เป็น" หรือไม่? หรือฉันไม่สามารถมองเห็นคนหลายพันคนที่ยังคงเรียนรู้ "C กับคลาส" และเขียนอาร์เรย์แบบไดนามิกของตนเองแทนที่จะใช้std::vectorและจัดการหน่วยความจำโดยการเรียกใหม่ / ลบจากโค้ดระดับบนสุดด้วยตนเอง

เท่าที่ฉันอยากจะเชื่อมันดูเหลือเชื่อถ้าชุมชน C ++ โดยรวมมีการพัฒนาอย่างมากในเวลาไม่กี่ปีโดยทั่วไป ประสบการณ์และความประทับใจของคุณเป็นอย่างไร?

(ข้อจำกัดความรับผิดชอบ: คนที่ไม่คุ้นเคยกับ C ++ อาจตีความชื่อเรื่องผิดเนื่องจากถามว่า C ++ กำลังได้รับความนิยมเมื่อเทียบกับภาษาอื่นหรือไม่นั่นไม่ใช่คำถามของฉัน "Modern C ++" เป็นชื่อสามัญสำหรับภาษาถิ่นหรือรูปแบบการเขียนโปรแกรมภายใน C ++ ซึ่งตั้งชื่อตามหนังสือ " การออกแบบ C ++ สมัยใหม่: ประยุกต์ใช้รูปแบบการเขียนโปรแกรมและการออกแบบทั่วไป "และฉันสนใจ แต่เพียงผู้เดียวกับ" C ++ เก่า "ดังนั้นไม่จำเป็นต้องบอกฉันว่าเวลาของ C ++ ผ่านไปแล้วและเราทุกคนควรใช้ Python;))


2
น่าเสียดายที่ฉันคิดว่าจะต้องใช้เวลาสักพักก่อนที่ชุมชน C ++ โดยรวมจะก้าวหน้าพอที่จะรับรู้วิธีใช้ไลบรารีมาตรฐานและเพิ่มประสิทธิภาพพร้อมกับการเพิ่ม C ++ 0x ที่กำลังจะเกิดขึ้นอย่างมีประสิทธิภาพ อย่างไรก็ตามฉันคิดว่า C ++ 0x ทำให้เกิดความหวังอย่างมากในการเพิ่มความนิยมของ C ++ มีการปรับปรุงความไม่สะดวกในการสังเคราะห์รายวันจำนวนมาก ฉันคิดเสมอว่าสิ่งเหล่านี้เป็นเรื่องเล็กน้อย แต่สำหรับคนภายนอกที่มองภาษานี่เป็นแหล่งที่มาของการร้องเรียน
stinky472

15
ในกรณีของฉันเมื่อใดก็ตามที่ฉันพบมืออาชีพคนหนึ่งที่เข้าใจเทคนิค C ++ สมัยใหม่เช่น RAII และความปลอดภัยยกเว้น (ไม่จำเป็นต้องอ้างถึงหนังสือของ Alexandrescu) หรือแม้แต่แนวคิดพื้นฐานที่สุดเช่นตัวทำซ้ำและอัลกอริทึมทั่วไปฉันพบอีกสิบคนที่ไม่เข้าใจ อย่างน้อยเมื่อพูดถึงมืออาชีพพวกเขาหลายคนก็จมอยู่กับกำหนดเวลาที่จะเรียนรู้สิ่งที่รู้ดังนั้นแม้แต่ผู้เชี่ยวชาญ C ++ ที่ประกาศตัวเองก็มักจะมีเรื่องให้เรียนรู้มากมาย ฉันกลัวว่าฉันจะกลายเป็นหนึ่งในคนที่มี C ++ 0x ด้วย: มีหลายอย่างที่ฉันต้องเรียนรู้และปรับตัวเพื่อให้ได้สิ่งนั้นและฉันมีกำหนดเวลาที่จะต้องเจอ
stinky472

คำตอบ:


76

นี่คือวิธีที่ฉันคิดว่าสิ่งต่างๆมีการพัฒนา

โปรแกรมเมอร์ C ++ รุ่นแรกคือโปรแกรมเมอร์ C ซึ่งจริงๆแล้วใช้ C ++ เป็น C กับคลาส นอกจากนี้ STL ยังไม่เข้าที่นั่นคือสิ่งที่ C ++ เป็นหลัก

เมื่อ STL ออกมาสิ่งที่ก้าวหน้านั้น แต่คนส่วนใหญ่ที่เขียนหนังสือรวบรวมหลักสูตรและชั้นเรียนการสอนได้เรียนรู้ C ก่อนจากนั้นจึงเรียนรู้ภาษา C ++ เพิ่มเติมดังนั้นคนรุ่นที่สองจึงเรียนรู้จากมุมมองนั้น ดังคำตอบอื่นที่ระบุไว้ว่าหากคุณสบายใจที่จะเขียนลูปเป็นประจำการเปลี่ยนไปใช้std::for_eachไม่ได้ซื้ออะไรให้คุณมากนักยกเว้นความรู้สึกคลุมเครืออันอบอุ่นที่คุณกำลังทำสิ่งที่ "ทันสมัย"

ตอนนี้เรามีอาจารย์และนักเขียนหนังสือที่ใช้ C ++ ทั้งหมดและรับคำแนะนำจากมุมมองนั้นเช่น Accelerated C ++ ของ Koenig & Moo และตำราเรียนใหม่ของ Stroustrup ดังนั้นเราจึงไม่ได้เรียนรู้แล้ว char*std::strings

เป็นบทเรียนที่น่าสนใจว่าต้องใช้เวลานานแค่ไหนในการเปลี่ยนวิธีการ "แบบเดิม" โดยเฉพาะอย่างยิ่งเมื่อมีประวัติประสิทธิผล


13
ใช่. มันฉลาดมากที่ทำให้ C ++ เข้ากันได้กับ C แบบย้อนกลับอย่างมากเนื่องจากมีการติดตั้งตัวเข้ารหัส C ขนาดใหญ่ คล้ายกับกลยุทธ์ที่ประสบความสำเร็จของ MS ในการรักษาความเข้ากันได้แบบย้อนหลังกับ DOS (ดูบล็อกที่ยอดเยี่ยมของ Raymond Chen สำหรับความยาวที่เจ็บปวดที่พวกเขาไป ... )
j_random_hacker

2
อ๊ะลองสัมผัสที่นั่นเล็กน้อย ... หมายถึงจะบอกว่าฉันคิดว่าคุณพูดถูกเกี่ยวกับ "การแบ่งรุ่น" ระหว่างคนที่เปลี่ยนมาจาก C (แต่ยังคงคิดแบบ C) กับคนที่ "รสนิยมแรก "ถูกโพสต์ STL C ++
j_random_hacker

57

ใช่แน่นอน สำหรับฉันถ้าคุณไม่ได้เขียนโปรแกรม C ++ ในรูปแบบ "Modern C ++" ตามที่คุณกำหนดก็ไม่มีประโยชน์ที่จะใช้ C ++! คุณอาจใช้ C ได้เช่นกัน "Modern C ++" ควรเป็นวิธีเดียวที่ C ++ เคยตั้งโปรแกรมไว้ในความคิดของฉันและฉันคาดหวังว่าทุกคนที่ใช้ C ++ และตั้งโปรแกรมในแฟชั่น "สมัยใหม่" จะเห็นด้วยกับฉัน อันที่จริงฉันมักจะตกใจมากเมื่อได้ยินโปรแกรมเมอร์ C ++ ที่ไม่รู้เรื่องต่างๆเช่น auto_ptr หรือ ptr_vector เท่าที่ฉันกังวลความคิดเหล่านั้นเป็นพื้นฐานและเป็นพื้นฐานสำหรับ C ++ ดังนั้นฉันจึงไม่สามารถจินตนาการได้อย่างอื่น


4
+1; ฉันเลือกรูปแบบ "c ++ สมัยใหม่" ตั้งแต่เนิ่นๆเพราะเป็นวิธีที่เป็นธรรมชาติ (ถ้าคุณไม่ได้คิดว่า C กับคลาส)
Adam Hawes

21
"แค่ใช้ C?" C มีพลังมาก
Clark Gaebel

4
หุ่นยนต์แน่ใจว่าจะไม่เขียนโปรแกรมใน C ++ พวกมันไม่โง่พอและจะหยุดพยายามรวบรวมมัน
Matt Joiner

6
@ClarkGaebel ถ้า C มีประสิทธิภาพ C ++ ก็เช่นกันโดยการสืบทอดจาก C โดยไม่มีปัญหา :)
legends2k

4
@rxantos คุณบอกว่าเหมือนเราไม่มีตัวเลือกมากมายในการประเมินประสิทธิภาพเช่นการดูเอาต์พุตการประกอบตัวจับเวลาจอภาพ RAM และอื่น ๆ อีกมากมาย C ++ ไม่แตกต่างจาก C ในเรื่องนั้น หากมีข้อสงสัยรายละเอียด สิ่งอื่นใดเป็นเพียงคำบอกเล่า
underscore_d

25

ในสมัยของ Windows 3.1 C เป็นมาตรฐาน เมื่อ C ++ เข้าสู่ตลาดนักพัฒนาและต่อมากลายเป็นมาตรฐาน ANSI มันเป็นความร้อนใหม่ นิยมใช้ตัวย่อ OOP และรูปแบบการออกแบบพื้นฐานบางส่วนโดยใช้ความหลากหลาย

ขณะนี้ด้วยการยอมรับแพลตฟอร์มที่มีการจัดการที่มีสิ่งกีดขวางต่ำเช่น C # / NET จึงมีเหตุผลน้อยกว่าที่จะใช้ C ++ ฐานนักพัฒนาจำนวนมากจะมีให้เลือกและขอบอกตามตรง: C ++ เป็นสิ่งที่ต้องเรียนรู้สำหรับมือใหม่ ด้วย C # คุณสามารถเรียกใช้มันได้

นั่นเหลือเพียงแพลตฟอร์มที่ต้องการ C ++ และผู้ประกาศ C ++ ที่ตายยากเพื่อฝึกฝนศิลปะ นี่คือชุมชนที่ต้องการและต้องการเลเยอร์ทั้งหมดของนามธรรมที่ถือว่าเป็น "Modern C ++"

ใช่แล้วฉันเชื่อว่า "Modern C ++" ตามที่คุณระบุกำลังแพร่หลายมากขึ้น แม้ว่าจะแพร่หลายในกลุ่มผู้ชมที่แตกต่างจากที่เคยใช้ในอดีต


มาเถอะคำตอบนี้ทำให้เกิดประเด็นดีๆ C ++ ไม่สมบูรณ์แบบเราทุกคนรู้ดีว่า Bjarne เองก็บ่นว่ามันใหญ่เกินไปและยากเกินไปที่จะเรียนรู้ แม้ว่าฉันจะไม่เห็นด้วยว่าทำไม Modern C ++ จึงค่อยๆเกิดขึ้น - IMHO มันใช้เวลานานแค่นี้สำหรับภาษาที่ใหญ่โตเช่นนี้ในการ "ส่งเสียงก้องไปข้างหน้า"
j_random_hacker

4
คุณกำลังบอกว่ายิ่งนักพัฒนาโดยเฉลี่ยมุ่งหน้าไปที่ C # และเช่นนั้นในขณะที่ฮาร์ดคอร์ยิ่งติดกับ C ++ มากขึ้น (ไม่ใช่ว่าไม่มีคน C # / NET ที่ฉลาดจริง ๆ แต่ก็มีคนฉลาดน้อยมากมาย) ทำให้รู้สึกได้ระดับหนึ่ง
David Thornley

3
ฉันคิดว่ามันเป็นจุดที่ใช้ได้ แน่นอนว่าไม่ใช่เรื่องจริงสำหรับทุกคน แต่ในระดับใหญ่ฉันเห็นด้วยคนส่วนใหญ่ที่มีทางเลือกได้เลือกใช้ภาษา C # หรือ Java หรือภาษาอื่น ๆ แล้ว
jalf

3
กรณีการใช้งาน: ฉันต้องการให้ไคลเอนต์ windows ทำ CRUD บนฐานข้อมูลของฉัน ใช้ C # /. NET หรือ C ++ / MFC? ฉันต้องการเว็บแอพ ... ใช้ C # / ASP.NET หรือ C ++ / ISAPI? ฉันต้องการโคลน "Nybbles" แบบง่ายๆโดยใช้ DirectX C # /. NET หรือ C ++ / MFC / WTL? ฉันต้องการการสาธิตที่ชนะที่ Assembly09 ... แน่นอน C ++ (เทียบกับ C #)
spoulson

8
ฉันไม่รู้ว่ามันเป็นเรื่องของนามธรรมหรือความตายที่ยากขึ้นกว่าเดิม ฉันสงสัยว่าประเภทของ abstractions ที่มีให้ผ่านเทมเพลตไม่สามารถใช้งานได้ใน Java หรือ C # ดังนั้นคนที่ชอบหรือต้องการมันจึงอยู่กับ C ++
Kragen Javier Sitaker

16

ฉันเป็นหนึ่งในคนเหล่านี้ที่เรียนรู้วิธีการทำงานกับ STL และได้ยินมากมายเกี่ยวกับ RAII และแนวทางการเขียนโปรแกรม C ++ ที่ดีตั้งแต่วันที่ 1 ดูเหมือนหนังสือที่แนะนำมากที่สุดสำหรับการเรียนรู้ C ++ ในวันนี้ (เช่น Accelerated C ++ และซีรีส์ C ++ ที่มีประสิทธิภาพ ) มุ่งเน้นไปที่การใช้เครื่องมือ STL แทนการรวบรวมข้อมูลของคุณเองและยังให้ "กฎ" มากมายสำหรับการเขียนโปรแกรมที่มีประสิทธิภาพ (หรือ "ทันสมัย")

แต่การพูดคุยกับเพื่อน ๆ ฉันยังสังเกตว่าบาง บริษัท ยังคงทำงานกับ "C with Classes" ไม่ใช่ "Modern C ++" บางทีวัฒนธรรมที่เสนอโดยผู้เขียนและผู้ใช้ "Modern C ++" จะมีชัยในสักวันหนึ่ง :)


ที่ทำงานเรายังคงใช้ C กับคลาสอยู่อาจเป็นเพราะมีตัวจับเวลาเก่าจำนวนมากที่อยู่มาระยะหนึ่งแล้ว ดูเหมือนพวกเขาจะระวังมากแม้กระทั่ง STL นับประสาอะไรกับ BOOST
รหัสผ่าน

12

ฉันคิดว่าคุณเพิ่งมีประสบการณ์ที่ไม่ดีในการเริ่มต้น

คุณต้องซื้อหนังสือScott Meyers Effective C ++ ด้วยตัวคุณเอง ฉันเริ่มใช้ C ++ ด้วยความโกรธในปี 2542 หัวหน้าทีมของฉันทำให้ฉันนั่งอ่าน C ++ ที่มีประสิทธิภาพและ C ++ ที่มีประสิทธิภาพมากขึ้นก่อนที่ฉันจะได้รับอนุญาตให้ตรวจสอบในรหัสใด ๆ

คำแนะนำส่วนใหญ่ของเขาอยู่ในแนว "อย่าใช้คุณลักษณะนี้แต่ถ้าคุณต้องจำสิ่งนี้ไว้"

หากคุณทำตามคำแนะนำของเขาคุณจะเขียน C ++ ที่ดีหรือ "ทันสมัย"

ตอนนี้เขามีหนังสือเกี่ยวกับ STL ด้วย แต่ฉันยังไม่ได้อ่าน


ฉันควรพูดว่านี่เป็นเพียงจุดเริ่มต้นของฉัน วันนี้ฉันสบายใจมากกับ STL, boost, RAII และอื่น ๆ ฉันแค่สงสัยว่าประสบการณ์ครั้งแรกของฉันเป็นอย่างไร
jalf

9

ในงาน C ++ ของฉันฉันพบว่ามีการใช้คุณสมบัติที่ทันสมัยมากขึ้นและมีคนถามฉันเกี่ยวกับฟีเจอร์เหล่านี้มากขึ้นในการฉายทางโทรศัพท์และการสัมภาษณ์ เท่าที่ฉันสามารถบอกได้พวกเขากำลังจับอยู่

ฉันเรียนรู้ C ++ มา แต่เดิมเป็น C กับ Classes; แม้ว่าภาษาจะก้าวหน้าไปไกลกว่านั้น แต่หนังสือที่ฉันอ่านและคนที่ฉันทำงานด้วยก็ติดอยู่กับ "C ++ เก่า" อย่างแน่นหนา RAII เป็นสิ่งที่ผู้คนมักจะนึกถึงแทนที่จะทำโดยอัตโนมัติและฉันจำได้ว่าอ่านบทความแรก ๆ เกี่ยวกับปัญหาด้านความปลอดภัยของข้อยกเว้น

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

Stroustrup เพียงแค่ออกมาพร้อมกับตำราเรียน, Programming: หลักการและการปฏิบัติใช้ C ฉันซื้อมันเพราะฉันยังไม่ล้มเหลวในการเรียนรู้สิ่งดีๆจากหนังสือของ Stroustrup แต่ยังไม่ผ่านสองสามบทแรก จนถึงตอนนี้สิ่งที่ฉันสามารถพูดได้ก็คือฉันเห็นด้วยกับวิธีที่เขาเริ่มต้นและอย่างน้อยก็เป็นการแนะนำวิธีใช้ C ++ ที่ดี


แม้แต่ STL เวอร์ชันแรกก็ยังไม่มีข้อยกเว้น
Kragen Javier Sitaker

2
ในเวลานั้นไม่มีใครรู้วิธีเขียนโค้ดที่ปลอดภัย ซึ่งได้ผลในช่วงหลายปีหลังการตีพิมพ์มาตรฐาน ฉันจำบทความบางส่วนในรายงาน C ++ ได้
David Thornley

7

ในขณะที่ทำงานในโครงการที่ฉันมีส่วนร่วมอยู่ในปัจจุบันมีโค้ด C ++ จำนวนมากซึ่งมีการพัฒนาในช่วงเวลาสำคัญ (มากกว่า 10 ปีแล้ว) วิวัฒนาการที่คุณพูดถึงนั้นสามารถมองเห็นได้อย่างชัดเจน: โค้ดรุ่นเก่ามักจะเป็น "C พร้อมคลาส" - พอยน์เตอร์ดิบchar*สตริงและการใช้ฟังก์ชัน C ที่เกี่ยวข้องอาร์เรย์ ฯลฯ รหัสที่ใหม่กว่าใช้ตัวชี้สมาร์ทของ ATL และอื่น ๆ ในการจัดการทรัพยากร แต่ยังคงยึดติดกับลูปที่เข้ารหัสด้วยมือเกือบตลอดเวลาและตัววนซ้ำเป็นสิ่งที่พบเห็นได้ยาก และอันใหม่ล่าสุดนั้นเต็มไปด้วยคอนเทนเนอร์ STL อัลกอริทึมshared_ptr(รวมถึงตัวลบแบบกำหนดเองเพื่อจัดการแฮนเดิล ฯลฯ ) ฟังก์ชันทั่วไปและเทมเพลตคลาสเป็นต้น เทคนิคการเขียนโค้ด "C พร้อมคลาส" แบบดั้งเดิมส่วนใหญ่เช่นพอยน์เตอร์ที่ไม่ได้ห่อหุ้มแบบดิบพร้อมการจัดการอายุการใช้งานด้วยตนเองนั้นมีการพิจารณาอย่างมากในการทบทวนโค้ดในปัจจุบัน เมื่อพิจารณาจากสิ่งนี้ดูเหมือนว่าการสังเกตของคุณจะถูกต้อง

การพัฒนาล่าสุดดูเหมือนจะเป็นแฟชั่นสำหรับ C ++ 0x lambdas ซึ่งมีด้านบวกในการที่จะปรับสมดุลในการใช้อัลกอริทึมมาตรฐานบนลูปที่เข้ารหัสด้วยมือเนื่องจากตอนนี้คุณสามารถมีโค้ดทั้งหมดของคุณแบบอินไลน์ได้ด้วย อัลกอริทึมเช่นกัน


6

ฉันจะไม่บอกว่า std :: vector มีคุณสมบัติเป็น "ทันสมัย" ในทุกวันนี้ มันเป็นพื้นฐานจริงๆ

โดยทั่วไปความประทับใจของฉันคือผู้คนได้รับประสบการณ์บางอย่างกับสไตล์ C ++ สมัยใหม่และมีสติขึ้นเล็กน้อย เพียงยกตัวอย่างง่ายๆ STL for_each นั้นน่าสนใจ แต่ในทางปฏิบัติแล้วมันไม่ได้เพิ่มมูลค่าที่น่ากลัวมากมายในลูป C ธรรมดา การดีบักทำได้ยากกว่าและบางครั้งก็ไม่ได้ให้ประสิทธิภาพที่ดีที่สุด นอกจากนี้โครงสร้างสำหรับการเขียนโปรแกรมเชิงฟังก์ชันใน STL ปัจจุบันมักจะยุ่งยากมากโดยเฉพาะอย่างยิ่งหากคุณได้รับประสบการณ์จากภาษาที่ใช้งานได้จริงเช่น ML


1
ทำไมคุณถึงบอกว่าเวกเตอร์ไม่มีคุณสมบัติเป็นสมัยใหม่ มันยังคงล้ำสมัยสำหรับกรณีการใช้งานมากมายแม้ว่าจะเป็นพื้นฐานก็ตาม แต่ฉันคิดว่าบางอย่างเป็นพื้นฐานไม่ได้หมายความว่ามันไม่ทันสมัย ตรงกันข้ามถ้ามีอะไร แต่ฉันคิดว่าฉันเห็นด้วยกับย่อหน้าที่สองของคุณ :)
Johannes Schaub - litb

4
แต่ฉันคิดว่านี่เป็นเพราะ ppl บางคนพยายามใช้ for_each และเพื่อนโดยทั่วไปสำหรับทุกสิ่งแม้กระทั่งสำหรับสิ่งต่างๆเช่นที่ for-loop แบบธรรมดาจะกระชับกว่า - ขยายวง 2 บรรทัดได้ถึง 10 บรรทัด ฉันคาดว่าจะมีคนใช้ for_each และเพื่อน ๆ มากขึ้นเมื่อ lambda จะพร้อมใช้งานใน C ++ 1x แม้ว่า
Johannes Schaub - litb

7
เวกเตอร์เป็นพื้นฐานตรงประเด็น มันไม่ได้เป็นพื้นฐานเสมอไป ครั้งหนึ่งมักถูกมองว่าเป็นสิ่งที่ซับซ้อนมาก (ใช้ TEMPLATES) และไม่มีประสิทธิภาพ (ไม่ใช่อาร์เรย์ดิบ) บางสิ่งที่ผู้เชี่ยวชาญอาจเทศนา แต่หลายคนก็ไม่ไว้วางใจ
jalf

2
อาจจะเป็นเพราะ std :: for_each นั้นแทบจะไม่เป็นสิ่งที่คุณต้องการเมื่อเทียบกับการพูดว่า ... std :: transform? การใช้อัลกอริทึมช่วยให้คุณกำจัดข้อบกพร่องที่พบบ่อยได้อย่างหนึ่งนั่นคือเงื่อนไขการวนซ้ำที่ไม่ถูกต้อง
Edouard A.

vector <bool> ไม่ธรรมดาอย่างแน่นอน ...
Kugel

6

จากประสบการณ์ของฉัน (Spanish University) น่าเสียดายที่บรรทัดฐานคือการไม่พิจารณาภาษาด้วยตัวมันเอง พวกเขาใช้ภาษาที่ง่ายที่สุดในการสอนการเขียนโปรแกรม (เช่น Java) เนื่องจากควรจะเป็นเรื่องง่ายสำหรับครูและนักเรียนจากนั้นจึงใช้ภาษา C สำหรับคลาส OS เป็นต้น

มีการแนะนำ C ++ เล็กน้อย (ในอัตราใด ๆ ในหลักสูตรใด ๆ ) เพียงเพื่อให้ C กับชั้นเรียน พวกเขาไม่ได้รับการส่งเสริมหรือแม้แต่ STL ฉันคิดว่าการปฏิบัติตามลักษณะและวิธีคิดของ C ++ นั้นมีค่าใช้จ่ายสูงสำหรับทั้งครูและนักเรียน มีโปรแกรมเมอร์ C ++ กี่คนที่รู้จักไลบรารี Boost ทั้งหมดเพียงพอที่จะใช้เพื่อให้โซลูชันที่ดีขึ้นหรือออกแบบได้ เราต้องมีความสนใจในการติดตามไลบรารีและสำนวนใหม่ ๆ ทั้งหมด

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

หากคุณปฏิบัติตามปรัชญานี้สำหรับคนส่วนใหญ่ที่ฉันรู้จัก C ++ จะเป็น "C พร้อมคลาส" เสมอ

ความนับถือ,


ส่วนใหญ่เป็นเรื่องธรรมดาในวิทยาศาสตร์คอมพิวเตอร์และโดยรวมแล้วฉันไม่คิดว่ามันเป็นเรื่องเลวร้าย (ไม่เน้นภาษานั่นคือภาษาที่สอนเห็นได้ชัดว่ายังสอนถูก).
jalf

+1: "(ไม่เน้นภาษานั่นคือภาษาที่ aRE สอนควรจะยังคงสอนอย่างถูกต้อง)"
Jared Updike

6

จากประสบการณ์ของฉันมันขึ้นอยู่กับอายุของผลิตภัณฑ์ / โครงการซอฟต์แวร์เป็นอย่างมาก โครงการใหม่ส่วนใหญ่ที่ฉันทราบว่าใช้ C ++ สมัยใหม่ (RAII, STL, Boost) อย่างไรก็ตามมีโปรเจ็กต์ C ++ มากมายที่มีอายุมากกว่า 10 ปีและคุณไม่เห็น C ++ ที่ทันสมัยอยู่ที่นั่น

นอกจากนี้โปรดทราบว่าการใช้งาน STL ที่ได้รับความนิยมมากที่สุดบางส่วนนั้นพังทลายไปมากจนกระทั่งเมื่อ 5 ปีที่แล้ว (MSVC <7.0 และ GNU <3.00)


4

ฉันคิดว่าอุปสรรคที่ใหญ่ที่สุดที่ฉันพบคือการสนับสนุน toolchain โดยเฉพาะอย่างยิ่งในโครงการข้ามแพลตฟอร์ม ไม่กี่ปีที่ผ่านมาเป็นเรื่องปกติที่จะเห็นบิลด์โน้ตบอกว่า "x แพลตฟอร์มต้องการให้ STLport ทำงานได้เนื่องจากคอมไพเลอร์ของพวกเขาถูกบอร์ก" แม้ตอนนี้ฉันพบปัญหาเกี่ยวกับผู้ที่พยายามใช้การอ้างอิงของบุคคลที่สามหลายรายการที่เชื่อมโยงกับ BOOST เวอร์ชันต่างๆ สิ่งนี้ทำให้การเชื่อมโยงเป็นไปไม่ได้หมายความว่าคุณต้องกลับไปสร้างทีมใหม่ตั้งแต่ต้น

ตอนนี้ทุกคนเลิกใช้ MSVC ++ 6 แล้วความยุ่งเหยิงของ STLport อยู่เบื้องหลังเรา แต่ทันทีที่ TR1 ออกจากประตูเราก็กลับไปที่ "เวอร์ชันใดที่สภาพแวดล้อมรองรับและทำให้ถูกต้อง" และอีกครั้งจะทำให้การนำไปใช้ช้าลง

ฉันทำงานกับโปรเจ็กต์ที่เริ่มต้นใน C (ไม่ใช่ C ++) ในปี 1992 การปรับใช้แนวทางปฏิบัติสมัยใหม่ในโค้ดเบสแบบเดิมคงเป็นไปไม่ได้ ในทำนองเดียวกันฉันทำงานในโปรเจ็กต์อื่นที่ใกล้เคียงกับความล้ำสมัยของภาษา C ++ มากขึ้น


3

หลายทีมที่ฉันเคยอยู่และได้ยินเกี่ยวกับการพิจารณารายใหญ่ "เราใช้ข้อยกเว้นหรือไม่" คำถาม. นี่คือรหัสสำหรับ "เราใช้ C ++ สมัยใหม่หรือไม่"

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

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

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

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


3

ก่อนที่จะตอบคำถามดังกล่าวคุณต้องยอมรับว่า "สมัยใหม่" คืออะไร สิ่งนี้ไม่น่าจะเกิดขึ้นเนื่องจาก "Modern" เป็นคำที่มีความหมายไม่ดีและหมายถึงสิ่งที่แตกต่างกันสำหรับคนอื่น ชื่อหนังสือของ Alexandrescu (การออกแบบ C ++ สมัยใหม่) ไม่ได้ช่วยอะไรเช่นกันเนื่องจากส่วนใหญ่เป็นหนังสือเกี่ยวกับ Template Metaprogramming ซึ่งเป็นพื้นที่เฉพาะของ C ++ แต่ไม่ได้มีเพียงเล่มเดียว

สำหรับฉัน "Modern C ++"! = "Template Metaprogramming" ฉันจะบอกว่าคุณสมบัติของ C ++ ที่อยู่ด้านบนของ C จะอยู่ในหมวดหมู่เหล่านี้:

  • คลาส (Constructors, Destructors, RAII, Dynamic Casting และ RTTI)
  • ข้อยกเว้น
  • อ้างอิง
  • โครงสร้างข้อมูลและอัลกอริทึมในไลบรารีมาตรฐาน (STL)
  • iostreams
  • เทมเพลตคลาสและฟังก์ชันที่เรียบง่าย
  • metaprogramming เทมเพลต

สิ่งเหล่านี้ไม่ทันสมัยเป็นพิเศษเนื่องจากมีมาเกือบ 10 ปีหรือมากกว่านั้น คุณสมบัติเหล่านี้ส่วนใหญ่มีประโยชน์และจะช่วยให้คุณสามารถทำงานได้มากกว่า C ตรงสำหรับกรณีการใช้งานจำนวนมาก โปรแกรมเมอร์ที่ดีควรและจะใช้ทั้งหมดในโครงการขนาดที่เหมาะสม แต่สิ่งเหล่านี้ไม่เหมือนอย่างอื่น:

เทมเพลต Metaprogramming

คำตอบสั้น ๆ สำหรับการเขียนโปรแกรม metaprogramming ของเทมเพลตคือตอบว่าไม่ น่าเสียดายสำหรับบางคนมันมีความหมายเหมือนกันกับ "การเขียนโปรแกรม C ++ สมัยใหม่" เนื่องจากหนังสือเล่มนี้ แต่สุดท้ายมันก็สร้างปัญหามากกว่าที่จะแก้ได้ เว้นแต่ C ++ จะพัฒนากลไกการเขียนโปรแกรมทั่วไปที่ดีขึ้นเช่นการสะท้อนกลับมันจะไม่เหมาะสำหรับการเขียนโปรแกรมทั่วไปและภาษาระดับสูงกว่าเช่น Python จะเหมาะกว่าสำหรับกรณีการใช้งานเหล่านั้น ด้วยเหตุผลดังกล่าวและเหตุผลอื่น ๆ อีกมากมายโปรดดูC ++ FQA


6
การเขียนโปรแกรมแม่แบบ IMHO แทบจะไม่จำเป็นสำหรับการเขียนโปรแกรมแอปพลิเคชันซึ่งทำหน้าที่เพียงเพื่อให้ระดับทั่วไปที่อาจไม่จำเป็นโดยเสียค่าใช้จ่ายในการอ่านและข้อบกพร่องที่ยากต่อการเข้าใจ แต่ OTOH มีประโยชน์อย่างยิ่งสำหรับผู้เชี่ยวชาญในการสร้างห้องสมุด (a la Boost) ซึ่งลักษณะทั่วไปที่เพิ่มเข้ามานั้นมีประโยชน์และกลไก (น่าเกลียดยุ่งยากและสับสน) สามารถซ่อนจากมุมมองได้
j_random_hacker

3
คุณมีสิทธิ์ในเทมเพลตนั้น metaprogramming สามารถใช้งานได้อย่างมีรสนิยมหากทำในปริมาณที่พอเหมาะโดยเฉพาะในไลบรารี แต่บ่อยครั้งที่ฉันเคยเห็นผู้คนไปไกลเกินไปในเส้นทางการเขียนโปรแกรมเมทาโพรแกรมของเทมเพลตและโปรแกรมของพวกเขาก็ประสบผล ฉันไม่ได้ต่อต้าน metaprogramming ในความเป็นจริงฉันเป็นผู้สนับสนุนที่แข็งแกร่งสำหรับมันเป็นเพียงสิ่งอำนวยความสะดวกของ C ++ สำหรับมันค่อนข้างหยาบ
Anton I.Sipos

2

หนังสือที่ดีที่สุดสำหรับการเรียนรู้ C ++ "C ++ แบบเร่ง" โดย Koenig & Moo สอนสิ่งที่คุณอธิบายว่าเป็น C ++ สมัยใหม่ดังนั้นฉันเดาว่าคนส่วนใหญ่ในปัจจุบันใช้มัน สำหรับพวกเราที่ใช้ C ++ มาระยะหนึ่งแล้ว (ตั้งแต่กลางยุค 80 ในกรณีของฉัน) C ++ ที่ทันสมัยช่วยบรรเทาความยุ่งยากในการเขียนอาร์เรย์สตริงตารางแฮชของเราเอง (ย้ำโฆษณาซ้ำ)


1
ไม่ได้หมายถึง necro แต่ฉันเพิ่งซื้อหนังสือตามคำแนะนำนี้ เราจะต้องไปดู!
Andrew Weir

2

ฉันได้ดูงานC ++ ในไลบรารีที่ "ทันสมัย" มีการใช้คำอธิบายงานมากขึ้นเรื่อย ๆ MFC ซึ่งเป็นไลบรารี c ++ "แบบเก่า" จึงมีการใช้น้อย


1

การกำหนดมาตรฐานของภาษาในช่วงปลายทศวรรษ 1990 เป็นขั้นตอนแรกโดยอนุญาตให้ผู้ผลิตคอมไพเลอร์ให้ความสำคัญกับชุดคุณลักษณะ "มาตรฐาน" และยังอนุญาตให้ภาษาแก้ไขขอบหยาบบางส่วนซึ่งปรากฏตามกระบวนการกำหนดมาตรฐาน

สิ่งนี้ทำให้สามารถพัฒนาเฟรมเวิร์กตามคุณสมบัติมาตรฐานของภาษาและไม่ได้อยู่บนคุณสมบัติที่มีให้โดยการใช้คอมไพเลอร์เฉพาะ ไลบรารี Boost มีความโดดเด่นในเรื่องนี้ นอกจากนี้ยังอนุญาตให้การพัฒนาใหม่ขึ้นอยู่กับงานก่อนหน้านี้จึงทำให้สามารถแก้ปัญหาที่ซับซ้อนได้มากขึ้น

การเปลี่ยนแปลงที่น่าสังเกตที่นี่คือวิธีการที่เฟรมเวิร์กก่อนหน้านี้เป็นไปตามแนวคิดของคลาสพื้นฐานและคลาสที่ได้รับมา (คุณสมบัติรันไทม์) แต่ปัจจุบันคุณลักษณะขั้นสูงส่วนใหญ่มักจะขึ้นอยู่กับเทมเพลต "เรียกซ้ำ" เป็นหลัก (คุณลักษณะเวลาคอมไพล์)

STL มีข้อดีและข้อเสีย แต่ก็รอดพ้นจากการทดสอบของเวลาหากคุณต้องการบางสิ่งที่ใช้งานได้และเป็นเรื่องง่าย STL ก็มีบางสิ่งที่จะช่วยให้คุณเริ่มต้นได้ ไม่มีประเด็นใดในการคิดค้นล้อใหม่ (เว้นแต่เหตุผลด้านการสอน)

ฮาร์ดแวร์คอมพิวเตอร์ได้ก้าวกระโดดอย่างมากจากปี 1990 จากนั้นหน่วยความจำและ CPU ก็ไม่ใช่ข้อ จำกัด สำหรับคอมไพเลอร์อีกต่อไป ดังนั้นการเพิ่มประสิทธิภาพเชิงทฤษฎีส่วนใหญ่จากหนังสือจึงเป็นไปได้

ขั้นตอนต่อไปของภาษาคือการสนับสนุนการเขียนโปรแกรมแบบมัลติคอร์ซึ่งเป็นส่วนหนึ่งของความพยายามมาตรฐาน 0x


1

ใช่และไม่. แน่นอนว่าโครงการใหม่ได้รับความนิยมมากขึ้นเรื่อย ๆ อย่างไรก็ตามยังคงมีอุปสรรคในการรับเลี้ยงบุตรบุญธรรมที่ใช้ได้จริงไม่ใช่เรื่องการเมืองที่คนอื่นไม่ได้กล่าวถึง มีไลบรารี C ++ เชิงพาณิชย์จำนวนมากที่ใช้ ABI จากคอมไพเลอร์โบราณที่ไม่รองรับคุณสมบัติที่เห็นใน Modern C ++ อย่างเหมาะสมและ บริษัท จำนวนมากต้องพึ่งพาไลบรารีเหล่านี้ ตัวอย่างเช่น Sun Studio บน Solaris ไม่สามารถทำงานร่วมกับ Boost ได้โดยไม่ต้องใช้ STLport แต่ไลบรารีเชิงพาณิชย์ของบุคคลที่สามที่คุณต้องการใช้จะต้องใช้ STL เวอร์ชันของ Sun เรื่องเดียวกันกับ GCC 2.95 และ Redhat Enterprise Linux


-3

เป็นเรื่องน่ายินดีที่ความพยายามเพียงเล็กน้อยในการทำให้ c ++ มีเสถียรภาพมากขึ้น ระบบเตือนมีอยู่ แต่ยังไม่พัฒนามากนัก การยิงตัวเองด้วยเท้านั้นง่ายกว่าเมื่อ 10 ปีก่อนเสียอีก ไม่รู้ว่าทำไม แต่ c ++ ยังคงเป็นภาษาโปรดของฉัน :)


ฉันขอแนะนำให้อ่านหนังสือหลายเล่มในชุดข้อความนี้ก่อนที่จะกล่าวอ้างเกี่ยวกับ "ความพยายามเพียงเล็กน้อย" ที่นำมาใช้ในการป้องกันการสั่นไหวของ C ++ และ "มันง่ายกว่าที่จะยิงตัวเองด้วยเท้าเปล่ากว่าเมื่อ 10 ปีก่อน"
Patrick Niedzielski

แน่นอนว่า std-library ให้ความเสถียรมากกว่าการจัดสรรหน่วยความจำและการจัดการสตริง น่าเสียดายที่ภายในมีการใช้รูปแบบการเข้ารหัสที่แปลกประหลาดซึ่งคุณอาจคิดว่ามันถูกเขียนโดยมนุษย์ต่างดาว :)
AareP

2
เนื่องจากไลบรารีมาตรฐานเป็นข้อมูลจำเพาะโปรดตำหนิผู้จำหน่ายคอมไพเลอร์ของคุณที่ใช้รูปแบบการเข้ารหัสภายในที่แปลกประหลาด และนอกจากนี้รูปแบบการเข้ารหัสแปลก ๆ = / = ไม่เสถียรหรือง่ายกว่าที่จะยิงตัวเองด้วยเท้า รูปแบบการเข้ารหัสเหล่านั้นส่วนใหญ่ (อย่างน้อยก็พูดเกี่ยวกับไลบรารี MSVC และอาจเกี่ยวกับคนอื่น ๆ ด้วย) ได้รับการออกแบบมาเพื่อไม่รบกวนคุณเลยดังนั้นคุณสามารถทำเรื่องโง่ ๆ ได้และห้องสมุดไม่จำเป็นต้องดูแล หากคุณเขียนโค้ดนอกข้อกำหนด C ++ นั่นเป็นสิ่งที่แตกต่าง
Patrick Niedzielski

โปรดทราบว่าการนำ STL ไปใช้งานโดยทั่วไป (โดยเฉพาะอย่างยิ่งหากมาพร้อมกับคอมไพเลอร์เฉพาะ) ไม่จำเป็นต้องใช้ Standard C ++ เพื่อใช้งานเอง สามารถใช้ประโยชน์จากความรู้เฉพาะด้านการนำไปใช้งานในตัวเองได้เป็นอย่างดีเพื่อให้รหัสของคุณเป็นไปตามการรับประกันตามมาตรฐาน อย่างไรก็ตามรหัสของคุณควรยึดติดกับสิ่งที่มาตรฐานรับประกันเท่านั้น คุณไม่สามารถเรียนรู้การรับประกันมาตรฐานโดยการตรวจสอบการใช้งาน C ++ หรือ STL เฉพาะ
Tanz87

คำตอบนี้เขียนเมื่อทศวรรษที่แล้ว ในตอนนั้นมันน่าทึ่งมากที่ได้ใช้ความพยายามอย่างมากในการทำให้ c ++ มีเสถียรภาพมากขึ้น นั่นเป็นหนึ่งในเหตุผลสำคัญที่ทำให้ c ++ 0x ใช้เวลานานมากในการเปิดตัวเป็น c ++ 11
David Hammen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.