ฉันรู้ว่าในบางพื้นที่ (เช่นอุตสาหกรรมเกม) ไม่แนะนำให้ใช้ STL ดังนั้นคำถามของฉันคือจริง ๆ แล้วมันเป็นการปฏิบัติที่ดีที่จะไม่ใช้ STL ในบางกรณีหรือไม่? ถ้าเป็นเช่นนั้นเหตุผลที่ดีที่สุดที่ไม่ใช้ STL ของ C ++ สมัยใหม่คืออะไร
ฉันรู้ว่าในบางพื้นที่ (เช่นอุตสาหกรรมเกม) ไม่แนะนำให้ใช้ STL ดังนั้นคำถามของฉันคือจริง ๆ แล้วมันเป็นการปฏิบัติที่ดีที่จะไม่ใช้ STL ในบางกรณีหรือไม่? ถ้าเป็นเช่นนั้นเหตุผลที่ดีที่สุดที่ไม่ใช้ STL ของ C ++ สมัยใหม่คืออะไร
คำตอบ:
ฉันสามารถคิดถึงเหตุผลที่ถูกต้องเพียงข้อเดียวและมันหายากจริง ๆ : ยากตามเวลาจริง มีหลายสิ่งในไลบรารีมาตรฐานที่จัดสรรหน่วยความจำภายในและไม่เพียงพอสำหรับการใช้งานแบบเรียลไทม์ดังนั้นจึงต้องหลีกเลี่ยง แอปพลิเคชันเหล่านี้มักจะค่อนข้างง่ายแม้ว่าจะใช้เวลาในการพัฒนาเนื่องจากการตรวจสอบและทดสอบอย่างเข้มงวด
ฉันสามารถนึกถึงเหตุผลที่ไม่ถูกต้อง แต่สาเหตุที่พบบ่อยมาก: นักพัฒนาที่ไม่เข้าใจความซับซ้อนในการคำนวณใช้ STL ในทางที่ผิดแล้วตำหนิห้องสมุด
โดยทั่วไปแล้ว STL จะเร็วกว่ารันไทม์มากกว่าโซลูชันแบบ C ที่มีตัวชี้การโทรกลับหรือโซลูชันที่ใช้ความหลากหลายด้วยวิธีเสมือน ( ดูคำปราศรัยสำคัญของ Bjarne Stroustrup ) อย่างไรก็ตามเมื่อนักพัฒนาไม่เข้าใจข้อกำหนดความซับซ้อนที่กำหนดและใช้ไลบรารีในทางที่ผิดโดยการสร้างเวกเตอร์ของเวกเตอร์ของวัตถุที่ซับซ้อนบางอย่าง (ใน C ++ 11 มันไม่ใช่ปัญหาอีกต่อไป แต่!) ทำให้เกิดปัญหาประสิทธิภาพและป้องกันตัวเอง ด้วย "คุณเห็นว่าเวกเตอร์ค่อนข้างช้า" มันอาจทำให้เกิดการรับรู้ว่าห้องสมุดมาตรฐานช้า และเมื่อผู้จัดการได้รับการรับรู้เช่นนั้นก็สามารถอยู่ในองค์กรได้นานมาก
เห็นได้ชัดว่าคุณไม่สามารถใช้สิ่งใดก็ตามที่แพลตฟอร์มที่คุณกำหนดเป้าหมายไม่สนับสนุน อย่างไรก็ตามเรากำลังกำหนดเป้าหมายแพลตฟอร์มมือถือที่ใช้กันมากที่สุดสี่แห่ง (Android, iOS, Bada และ WinCE แบบเก่า) และใช้ไลบรารีมาตรฐานและบางส่วนของBoostในทุกแพลตฟอร์ม
ไลบรารีมาตรฐานส่วนใหญ่เคยได้รับการสนับสนุนโดย Microsoft ในช่วงต้นของ WinCE (IIRC iostreams ออกมาพร้อมกับ Visual Studio 2005) เท่านั้น แต่ก็เป็นไปได้ที่จะใช้STLportนานกว่านั้นแทน และโดยปกติคุณสามารถรวบรวมสิ่งนั้นได้ ดังนั้นฉันจะเรียกเหตุผลนี้ว่าไม่ถูกต้องเช่นกัน
นอกจากนี้เป็นเวลานานไม่ใช่ "STL" แต่เป็น ANSI C ++ Standard Library มันถูกกำหนดโดยเอกสารมาตรฐานเดียวกันกับที่กำหนดภาษาเอง อะไรก็ตามที่ไม่สนับสนุนมันไม่สมควรถูกเรียกว่า C ++
sprintf
มักจะจัดสรรหน่วยความจำด้วย ในแพลตฟอร์มเรียลไทม์ฟังก์ชันไลบรารีมาตรฐานก็มีข้อ จำกัด ที่กำหนดไว้เช่นกัน สิ่งนี้ทำให้การปรับใช้ C ++ แบบเรียลไทม์ยาก: คุณต้องพัฒนาทั้งไลบรารีมาตรฐาน C ++ อย่างระมัดระวังซึ่งทำงานได้ดีกว่าไลบรารี่มาตรฐานขนาดเล็ก C เท่านั้น
ฉันใช้ STL และเพิ่มหลายปีแล้ว หากฉันต้องการละทิ้งมันและใช้เครื่องมือที่กำหนดเองของฉันแรงจูงใจจะเป็น:
มีเหตุผลสำคัญข้อหนึ่งที่จะไม่ใช้ไลบรารีเทมเพลตมาตรฐาน C ++: หนึ่งในแพลตฟอร์มเป้าหมายของคุณไม่มีการนำไปปฏิบัติอย่างสมบูรณ์ (หรือไม่มีการนำไปใช้เลย) และคุณรู้ว่าจะไม่ได้รับ ภายในปีหน้า
ฉันไม่รู้เกี่ยวกับความซับซ้อน (ประสิทธิภาพของการนำไปใช้) แต่ฉันใช้คอนเทนเนอร์และสตริงของ Qt อย่างกว้างขวางแทนที่จะใช้ std และทำงานได้ดี ฉันยังพบว่าการใช้ Qt ของชุดและรายการใช้งานง่ายขึ้น
ดังนั้นจึงเป็นประโยชน์ในการละทิ้ง STL ถ้าคุณสามารถใช้ไลบรารีอื่นที่เหมาะกับความต้องการของคุณ
QList<T>::iterator
Patrick ได้กล่าวถึงเหตุผลที่ไม่ใช้ STL ทั้งหมดนั่นคือแพลตฟอร์มของคุณไม่มี
โดยรวมแล้วฉันคิดว่าคำถามนั้นไม่มีจุด ส่วนใหญ่ไม่ใช่การตัดสินใจทั้งหมดหรือไม่มีอะไรเลย แต่เป็นหนึ่งในการเลือกและเลือก คุณอาจตัดสินใจที่จะไปกับคอนเทนเนอร์และอัลกอริทึม แต่ตัดสินใจที่จะใช้บางสิ่งบางอย่างนอก Std Lib สำหรับสตริงและ i / o
มันไม่สามารถใช้งานได้เว้นแต่จะมีเหตุผลอย่างมากที่ต้องทำเช่นนั้น เหตุผลบางประการที่ฉันคิดว่ารวมเพียงบางส่วนหรือขาดการใช้ STL (หรือส่วนอื่น ๆ ของไลบรารีมาตรฐาน) หรือข้อ จำกัด ทรัพยากร (หน่วยความจำ, ความเร็วของ CPU, ที่เก็บข้อมูล, ... ) ที่คุณต้องหลีกเลี่ยง กลิ้งเครื่องมือของคุณเองซึ่งเป็นไปตามสิ่งที่คุณต้องทำให้สำเร็จ
ในอุตสาหกรรมเกมสตูดิโอส่วนใหญ่ (เล็กไปจนถึงบางส่วน) มีห้องสมุดภายในและการใช้งานของชิ้นส่วนห้องสมุดมาตรฐานจำนวนมากซึ่งออกแบบมาอย่างดีสำหรับแพลตฟอร์มเป้าหมายและในบางกรณีเป้าหมายเป็นภาษาอังกฤษหรือแม้แต่เกมเอง เพียงแค่ใส่เมื่อพัฒนาเกมสำหรับคอนโซลฮาร์ดแวร์นั้นถูก จำกัด ด้วยมาตรฐานของทุกวันนี้ มีแอสเซมบลีที่สร้างขึ้นด้วยมือหลายพันรายการด้วยเหตุผลหลายประการ มันสำคัญมากที่จะลดการใช้ทรัพยากรในโค้ดของคุณให้เล็กที่สุดเพื่อให้เกมทำงานได้เร็วขึ้นซึ่งจะช่วยให้มีเนื้อหามากขึ้นในโลกของเกม (หรือโลกที่ใหญ่กว่าตัวอย่าง) ซึ่งหวังว่าจะส่งผลให้ผลิตภัณฑ์ดีขึ้น
"ทุกเกมที่ประสบความสำเร็จเริ่มต้นด้วยการนำการติดตั้งลิสต์ของคุณไปใช้"