Memori fragmentasi adalah konsep yang sama dengan disk fragmentasi: ini mengacu pada ruang yang terbuang karena area yang digunakan tidak cukup berdekatan.
Misalkan untuk contoh mainan sederhana bahwa Anda memiliki sepuluh byte memori:
| | | | | | | | | | |
0 1 2 3 4 5 6 7 8 9
Sekarang mari kita alokasikan tiga blok tiga byte, nama A, B, dan C:
| A | A | A | B | B | B | C | C | C | |
0 1 2 3 4 5 6 7 8 9
Sekarang alokasikan blok B:
| A | A | A | | | | C | C | C | |
0 1 2 3 4 5 6 7 8 9
Sekarang apa yang terjadi jika kita mencoba mengalokasikan empat byte blok D? Yah, kami memiliki empat byte memori bebas, tetapi kami tidak memiliki empat byte memori yang berdekatan , jadi kami tidak dapat mengalokasikan D! Ini adalah penggunaan memori yang tidak efisien, karena kita seharusnya dapat menyimpan D, tetapi kami tidak dapat melakukannya. Dan kami tidak dapat memindahkan C untuk memberi ruang, karena sangat mungkin beberapa variabel dalam program kami menunjuk ke C, dan kami tidak dapat secara otomatis menemukan dan mengubah semua nilai-nilai ini.
Bagaimana Anda tahu itu masalah? Nah, pertanda terbesar adalah bahwa ukuran memori virtual program Anda jauh lebih besar daripada jumlah memori yang sebenarnya Anda gunakan. Dalam contoh dunia nyata, Anda akan memiliki lebih dari sepuluh byte memori, jadi D hanya akan dialokasikan mulai byte 9, dan byte 3-5 akan tetap tidak digunakan kecuali Anda nanti mengalokasikan sesuatu yang panjangnya tiga byte atau lebih kecil.
Dalam contoh ini, 3 byte tidak terlalu banyak untuk diboroskan, tetapi pertimbangkan kasus yang lebih patologis di mana dua alokasi beberapa byte, misalnya, terpisah sepuluh megabyte dalam memori, dan Anda perlu mengalokasikan blok ukuran 10 megabyte +1 byte Anda harus meminta OS untuk lebih dari sepuluh megabyte lebih banyak memori virtual untuk melakukan itu, meskipun Anda hanya satu byte malu sudah memiliki cukup ruang.
Bagaimana Anda mencegahnya? Kasus terburuk cenderung muncul ketika Anda sering membuat dan menghancurkan benda-benda kecil, karena itu cenderung menghasilkan efek "keju swiss" dengan banyak benda kecil yang dipisahkan oleh banyak lubang kecil, sehingga tidak mungkin mengalokasikan benda yang lebih besar di lubang-lubang itu. Ketika Anda tahu Anda akan melakukan ini, strategi yang efektif adalah dengan pra-alokasi blok memori besar sebagai kumpulan untuk objek kecil Anda, dan kemudian secara manual mengelola pembuatan objek kecil di dalam blok itu, daripada membiarkan pengalokasi default menanganinya.
Secara umum, semakin sedikit alokasi yang Anda lakukan, semakin kecil kemungkinan memori terfragmentasi. Namun, STL menangani hal ini dengan cukup efektif. Jika Anda memiliki string yang menggunakan keseluruhan dari alokasi saat ini dan Anda menambahkan satu karakter untuk itu, itu tidak hanya mengalokasikan kembali ke panjang saat ini ditambah satu, itu menggandakan panjangnya. Ini adalah variasi pada strategi "kumpulan untuk alokasi kecil yang sering". Tali mengambil sebagian besar memori sehingga dapat menangani secara efisien dengan peningkatan ukuran kecil berulang tanpa melakukan realokasi kecil berulang. Semua wadah STL sebenarnya melakukan hal semacam ini, jadi umumnya Anda tidak perlu terlalu khawatir tentang fragmentasi yang disebabkan oleh realokasi ulang wadah STL.
Meskipun tentu saja wadah STL tidak menyatukan memori antara satu sama lain, jadi jika Anda akan membuat banyak wadah kecil (daripada beberapa wadah yang sering diubah ukurannya), Anda mungkin harus khawatir dengan mencegah fragmentasi dengan cara yang sama seperti Anda. akan untuk benda kecil yang sering dibuat, STL atau tidak.