Ini sebenarnya jenis yang diperlukan untuk mengimplementasikan segala jenis struktur data yang mengalokasikan lebih banyak memori daripada jumlah minimum yang diperlukan untuk jumlah elemen yang dimasukkan (yaitu, apa pun selain struktur tertaut yang mengalokasikan satu node pada suatu waktu).
Kontainer take suka unordered_map
, vector
atau deque
. Ini semua mengalokasikan lebih banyak memori daripada yang diperlukan minimal untuk elemen yang Anda masukkan sejauh ini untuk menghindari membutuhkan alokasi tumpukan untuk setiap penyisipan tunggal. Mari kita gunakan vector
sebagai contoh paling sederhana.
Saat kamu melakukan:
vector<Foo> vec;
// Allocate memory for a thousand Foos:
vec.reserve(1000);
... itu tidak benar-benar membangun seribu Foos. Itu hanya mengalokasikan / cadangan memori untuk mereka. Jika vector
tidak menggunakan penempatan baru di sini, itu akan membangun-default di Foos
semua tempat serta harus memanggil destruktor mereka bahkan untuk elemen yang bahkan tidak pernah Anda masukkan di tempat pertama.
Alokasi! = Konstruksi, Membebaskan! = Penghancuran
Secara umum, untuk menerapkan banyak struktur data seperti di atas, Anda tidak dapat memperlakukan alokasi memori dan membangun elemen sebagai satu hal yang tidak dapat dibagi, dan Anda juga tidak dapat memperlakukan memori bebas dan menghancurkan elemen sebagai satu hal yang tidak dapat dibagi.
Harus ada pemisahan antara ide-ide ini untuk menghindari konstruktor dan penghancur yang berlebihan yang tidak perlu ke kiri dan kanan, dan itulah sebabnya perpustakaan standar memisahkan ide std::allocator
(yang tidak membangun atau menghancurkan elemen ketika mengalokasikan / membebaskan memori *) dari kontainer yang menggunakannya yang secara manual membangun elemen menggunakan penempatan yang baru dan secara manual menghancurkan elemen menggunakan doa eksplisit dari destruktor.
- Aku benci desain
std::allocator
tapi itu subjek yang berbeda, aku tidak akan mengomel. :-D
Jadi, bagaimanapun, saya cenderung sering menggunakannya karena saya telah menulis sejumlah kontainer standar C ++ yang sesuai dengan tujuan umum yang tidak dapat dibangun dalam hal yang sudah ada. Termasuk di antaranya adalah implementasi vektor kecil yang saya buat beberapa dekade yang lalu untuk menghindari alokasi tumpukan dalam kasus-kasus umum, dan trie yang hemat memori (tidak mengalokasikan satu simpul pada satu waktu). Dalam kedua kasus saya tidak bisa benar-benar menerapkannya menggunakan wadah yang ada, jadi saya harus menggunakannyaplacement new
untuk menghindari konstruktor dan destruktor berlebihan pada hal-hal yang tidak perlu kiri dan kanan.
Tentu saja jika Anda pernah bekerja dengan pengalokasi khusus untuk mengalokasikan objek secara individual, seperti daftar gratis, maka Anda umumnya juga ingin menggunakan placement new
, seperti ini (contoh dasar yang tidak repot dengan pengecualian-keselamatan atau RAII):
Foo* foo = new(free_list.allocate()) Foo(...);
...
foo->~Foo();
free_list.free(foo);