จากมุมมองเชิงตรรกะ (ไม่ใช่ด้านเทคนิค) จะไม่มีประโยชน์
รหัส C / C ++ ธรรมดาใด ๆ สามารถห่อหุ้มด้วย "การสร้างห้องสมุด" ที่เหมาะสม หลังจากการห่อเช่นนี้เรื่องของ "ไม่ว่าจะเป็นข้อได้เปรียบกว่านั้น" กลายเป็นคำถามที่สงสัย
จากมุมมองของความเร็ว C / C ++ ควรอนุญาตให้ไลบรารีสร้างเพื่อสร้างโค้ดที่มีประสิทธิภาพเท่ากับโค้ดธรรมดาที่ล้อมรอบ อย่างไรก็ตามเรื่องนี้ขึ้นอยู่กับ:
- ฟังก์ชั่นอินไลน์
- การตรวจสอบเวลาแบบคอมไพล์และการกำจัดการตรวจสอบรันไทม์ที่ไม่จำเป็น
- การกำจัดรหัสที่ตายแล้ว
- การปรับแต่งโค้ดอื่น ๆ อีกมากมาย ...
การใช้อาร์กิวเมนต์ที่ไม่ใช่ด้านเทคนิคประเภทนี้ทุกคนสามารถเพิ่ม "ฟังก์ชั่นที่หายไป" ได้ดังนั้นจึงไม่ถือว่าเป็นข้อเสีย
อย่างไรก็ตามข้อกำหนดและข้อ จำกัด ในตัวไม่สามารถเอาชนะได้ด้วยรหัสเพิ่มเติม ด้านล่างฉันยืนยันว่าขนาดของstd::bitset
ค่าคงที่เวลารวบรวมและดังนั้นในขณะที่ไม่นับเป็นข้อเสียก็ยังคงเป็นสิ่งที่มีผลต่อการเลือกของผู้ใช้
จากมุมมองที่สวยงาม (ความสามารถในการอ่าน, ความสะดวกในการบำรุงรักษา ฯลฯ ) มีความแตกต่าง
อย่างไรก็ตามจะไม่ปรากฏว่าstd::bitset
รหัสชนะทันทีเหนือรหัส C ธรรมดา เราต้องดูโค้ดขนาดใหญ่กว่า (และไม่ใช่ตัวอย่างของเล่น) เพื่อบอกว่าการใช้งานstd::bitset
ได้ปรับปรุงคุณภาพของซอร์สโค้ดของมนุษย์หรือไม่
ความเร็วของการจัดการบิตขึ้นอยู่กับรูปแบบการเข้ารหัส รูปแบบการเข้ารหัสมีผลต่อการจัดการบิตทั้ง C / C ++ และใช้ได้กับstd::bitset
เช่นกันตามที่อธิบายไว้ด้านล่าง
หากมีการเขียนรหัสที่ใช้ในoperator []
การอ่านและเขียนทีละบิตหนึ่งจะต้องทำเช่นนี้หลายครั้งหากมีมากกว่าหนึ่งบิตที่จะจัดการ รหัสเดียวกันสามารถพูดได้ของ C-style
อย่างไรก็ตามbitset
ยังมีผู้ประกอบการอื่น ๆ เช่นoperator &=
, operator <<=
เป็นต้นซึ่งทำงานบนเต็มความกว้างของ bitset เนื่องจากเครื่องจักรพื้นฐานสามารถทำงานกับ 32- บิต, 64- บิตและบางครั้ง 128- บิต (กับ SIMD) ในเวลา (ในจำนวนรอบของ CPU เดียวกัน), รหัสที่ถูกออกแบบมาเพื่อใช้ประโยชน์จากการดำเนินงานหลายบิตดังกล่าว สามารถเร็วกว่าโค้ด "การจัดการบิต" แบบวนซ้ำ
แนวคิดทั่วไปเรียกว่าSWAR (SIMD ภายในการลงทะเบียน)และเป็นหัวข้อย่อยภายใต้การจัดการบิต
ผู้ขาย C ++ บางรายอาจใช้งานbitset
ระหว่าง 64- บิตและ 128- บิตด้วย SIMD ผู้ขายบางรายอาจไม่ (แต่อาจทำในที่สุด) หากจำเป็นต้องทราบว่าไลบรารีของผู้ขาย C ++ กำลังทำอะไรวิธีเดียวคือดูที่การถอดแยกชิ้นส่วน
สำหรับstd::bitset
ข้อ จำกัด นั้นฉันสามารถยกตัวอย่างได้สองแบบ
- ขนาดของ
std::bitset
ต้องเป็นที่รู้จักในเวลารวบรวม std::vector<bool>
เพื่อให้อาร์เรย์ของบิตที่มีขนาดที่ได้รับการแต่งตั้งแบบไดนามิกที่หนึ่งจะต้องใช้
- ข้อมูลจำเพาะ C ++ ปัจจุบันสำหรับ
std::bitset
ไม่ได้ให้วิธีการแยกชิ้นส่วนต่อเนื่องของ N บิตจากbitset
M บิตขนาดใหญ่
สิ่งแรกคือพื้นฐานซึ่งหมายความว่าสำหรับผู้ที่ต้องการบิตเซ็ตที่มีขนาดแบบไดนามิกพวกเขาจะต้องเลือกตัวเลือกอื่น ๆ
อันที่สองสามารถเอาชนะได้เพราะเราสามารถเขียนอะแดปเตอร์บางชนิดเพื่อทำงานได้แม้ว่ามาตรฐานbitset
จะไม่สามารถขยายได้
มีบางประเภทของการดำเนินงาน SWAR std::bitset
ขั้นสูงที่จะไม่ให้ออกจากกล่องจากมี หนึ่งสามารถอ่านข้อมูลเกี่ยวกับการดำเนินงานเหล่านี้บนเว็บไซต์นี้เกี่ยวกับพีชคณิตบิต std::bitset
ตามปกติหนึ่งสามารถดำเนินการเหล่านี้ได้ด้วยตัวเองในการดำเนินงานด้านบนของ
เกี่ยวกับการอภิปรายเกี่ยวกับประสิทธิภาพ
การตักเตือนครั้งเดียว: ผู้คนมากมายถามว่าทำไม(บางอย่าง)จากไลบรารี่มาตรฐานนั้นช้ากว่าโค้ดสไตล์ C ง่ายๆ ฉันจะไม่ทำซ้ำความรู้ที่จำเป็นของ microbenchmarking นี่ แต่ฉันเพียงแค่มีคำแนะนำนี้: ให้แน่ใจว่ามาตรฐานในโหมด "ปล่อย" (ด้วยการเพิ่มประสิทธิภาพเปิดใช้งาน) และให้แน่ใจว่ารหัสไม่ได้ถูกตัดออก (กำจัดรหัสตาย)หรือความเป็นอยู่ยกออกจากวง (วงคงเคลื่อนไหว code)
เนื่องจากโดยทั่วไปเราไม่สามารถบอกได้ว่ามีใครบางคน (บนอินเทอร์เน็ต) ทำไมโครบุ๊กมาร์กอย่างถูกต้องวิธีเดียวที่เราจะได้ข้อสรุปที่เชื่อถือได้ก็คือการทำไมโครบุ๊กมาร์คของเราเองและจัดทำเอกสารรายละเอียด ไม่เจ็บที่จะทำ microbenchmarks ที่คนอื่นทำมาก่อน
std::bitset
ได้รับการแก้ไข ณ เวลารวบรวม นั่นเป็นข้อเสียเปรียบเพียงอย่างเดียวที่ฉันคิดได้