ลองนึกภาพว่าคุณมีหน่วยความจำว่างขนาดใหญ่ (32 ไบต์):
----------------------------------
| |
----------------------------------
ตอนนี้จัดสรรบางส่วน (การจัดสรร 5 ครั้ง):
----------------------------------
|aaaabbccccccddeeee |
----------------------------------
ทีนี้ให้จัดสรรสี่ครั้งแรกฟรี แต่ไม่ใช่การจัดสรรที่ห้า:
----------------------------------
| eeee |
----------------------------------
ตอนนี้พยายามจัดสรร 16 ไบต์ อุ๊ปส์ฉันทำไม่ได้แม้ว่าจะมีเกือบสองเท่าที่ฟรีมาก
บนระบบที่มีหน่วยความจำเสมือนการแตกแฟรกเมนต์มีปัญหาน้อยกว่าที่คุณคิดเนื่องจากการจัดสรรจำนวนมากจำเป็นต้องต่อเนื่องกันในพื้นที่ที่อยู่เสมือนไม่ใช่ในพื้นที่ที่อยู่ทางกายภาพ ดังนั้นในตัวอย่างของฉันถ้าฉันมีหน่วยความจำเสมือนที่มีขนาดหน้า 2 ไบต์ฉันสามารถทำการจัดสรร 16 ไบต์โดยไม่มีปัญหา หน่วยความจำกายภาพจะมีลักษณะเช่นนี้:
----------------------------------
|ffffffffffffffeeeeff |
----------------------------------
ในขณะที่หน่วยความจำเสมือน (มีขนาดใหญ่กว่า) อาจมีลักษณะเช่นนี้:
------------------------------------------------------...
| eeeeffffffffffffffff
------------------------------------------------------...
อาการคลาสสิกของการแตกแฟรกเมนต์ของหน่วยความจำคือคุณพยายามจัดสรรบล็อกขนาดใหญ่และคุณทำไม่ได้แม้ว่าคุณจะมีหน่วยความจำว่างเพียงพอก็ตาม ผลลัพธ์ที่เป็นไปได้อีกอย่างหนึ่งคือกระบวนการไม่สามารถปล่อยหน่วยความจำกลับสู่ระบบปฏิบัติการ (เนื่องจากยังมีวัตถุบางส่วนที่ยังคงใช้งานอยู่ในบล็อกทั้งหมดที่จัดสรรจากระบบปฏิบัติการแม้ว่าบล็อกเหล่านั้นส่วนใหญ่จะไม่ได้ใช้)
กลยุทธ์เพื่อป้องกันการกระจายตัวของหน่วยความจำใน C ++ ทำงานโดยการจัดสรรวัตถุจากพื้นที่ต่าง ๆ ตามขนาดและ / หรืออายุการใช้งานที่คาดไว้ ดังนั้นหากคุณจะสร้างวัตถุจำนวนมากและทำลายพวกมันทั้งหมดในภายหลังให้จัดสรรพวกมันจากพูลหน่วยความจำ การจัดสรรอื่น ๆ ที่คุณทำระหว่างการจัดสรรจะไม่ได้มาจากพูลดังนั้นจะไม่อยู่ระหว่างการจัดสรรหน่วยความจำดังนั้นหน่วยความจำจะไม่ได้รับการแยกส่วน
โดยทั่วไปคุณไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้มากนักเว้นแต่ว่าโปรแกรมของคุณจะใช้งานได้ยาวนานและมีการจัดสรรและปล่อยจำนวนมาก เมื่อคุณมีการผสมผสานของวัตถุระยะสั้นและระยะยาวที่มีความเสี่ยงมากที่สุด แต่ถึงอย่างนั้นก็malloc
จะพยายามอย่างดีที่สุด โดยทั่วไปให้เพิกเฉยต่อไปจนกว่าโปรแกรมของคุณจะมีการจัดสรรล้มเหลวหรือทำให้ระบบมีหน่วยความจำเหลือน้อยโดยไม่คาดคิด
ไลบรารีมาตรฐานไม่ได้แย่ไปกว่าสิ่งอื่นใดที่จัดสรรหน่วยความจำและคอนเทนเนอร์มาตรฐานทั้งหมดมีAlloc
พารามิเตอร์เทมเพลตซึ่งคุณสามารถใช้ปรับกลยุทธ์การจัดสรรหากจำเป็น