<allocators>
Menentukan beberapa templat yang membantu mengalokasikan dan membebaskan blok memori untuk kontainer berbasis simpul.
Sintaksis
#include <allocators>
Catatan
<alokator> tidak digunakan lagi, dimulai dengan Visual Studio 2019 versi 16.3.
Keterangan
Header <alokator> menyediakan enam templat alokator yang dapat digunakan untuk memilih strategi manajemen memori untuk kontainer berbasis simpul. Untuk digunakan dengan templat ini, ini juga menyediakan beberapa filter sinkronisasi yang berbeda untuk menyesuaikan strategi manajemen memori dengan berbagai skema multithreading yang berbeda (termasuk tidak ada). Anda dapat mempercepat aplikasi, atau mengurangi persyaratan memorinya, dengan mencocokkan strategi manajemen memori dengan pola penggunaan memori dan persyaratan sinkronisasinya.
Templat alokator diimplementasikan dengan komponen yang dapat digunakan kembali yang dapat disesuaikan atau diganti untuk memberikan strategi manajemen memori tambahan.
Kontainer berbasis simpul di Pustaka Standar C++ (std::list, std::set, std::multiset, std::map, dan std::multimap) menyimpan elemennya dalam simpul individual. Semua node untuk jenis kontainer tertentu berukuran sama, sehingga fleksibilitas manajer memori tujuan umum tidak diperlukan. Karena ukuran setiap blok memori diketahui pada waktu kompilasi, manajer memori bisa jauh lebih sederhana dan lebih cepat.
Ketika digunakan dengan kontainer yang bukan berbasis node (seperti kontainer Pustaka Standar C++ std::vector std::d eque, dan std::basic_string), templat alokator akan berfungsi dengan benar, tetapi tidak mungkin memberikan peningkatan performa apa pun atas alokator default.
Alokator adalah templat kelas yang menjelaskan objek yang mengelola alokasi penyimpanan dan membebaskan objek dan array objek dari jenis yang ditunjuk. Objek alokator digunakan oleh beberapa templat kelas kontainer di Pustaka Standar C++.
Semua alokator adalah templat jenis ini:
template<class Type>
class allocator;
di mana argumen Type
templat adalah jenis yang dikelola oleh instans alokator. Pustaka Standar C++ menyediakan alokator default, alokator templat kelas, yang didefinisikan dalam <memori>. Header <alokator> menyediakan alokator berikut:
Gunakan instans yang sesuai dari alokator sebagai argumen jenis kedua saat membuat kontainer, seperti contoh kode berikut.
#include <list>
#include <allocators>
std::list<int, stdext::allocators::allocator_chunklist<int> > _List0;
_List0 mengalokasikan simpul dengan allocator_chunklist
dan filter sinkronisasi default.
Gunakan ALLOCATOR_DECL makro untuk membuat templat alokator dengan filter sinkronisasi selain default:
#include <list>
#include <allocators>
ALLOCATOR_DECL(CACHE_CHUNKLIST, stdext::allocators::sync_per_thread, Alloc);
std::list<int, alloc<int> > _List1;
_Lst1 mengalokasikan simpul dengan allocator_chunklist
dan filter sinkronisasi sync_per_thread .
Alokator blok adalah cache atau filter. Cache adalah templat kelas yang mengambil satu argumen jenis std::size_t. Ini mendefinisikan alokator blok yang mengalokasikan dan membatalkan alokasi blok memori dengan satu ukuran. Ini harus mendapatkan memori menggunakan operator new
, tetapi tidak perlu melakukan panggilan terpisah ke operator new
untuk setiap blok. Ini mungkin, misalnya, suballocate dari blok yang lebih besar atau blok cache yang dibatalkan alokasinya untuk realokasi berikutnya.
Dengan pengkompilasi yang tidak dapat mengikat kembali nilai argumen std::size_t yang digunakan ketika templat dibuat belum tentu nilai argumen _Sz diteruskan ke fungsi anggota cache yang mengalokasikan dan membatalkan alokasi.
<alokator> menyediakan templat cache berikut:
Filter adalah alokator blok yang mengimplementasikan fungsi anggotanya menggunakan alokator blok lain, yang diteruskan sebagai argumen templat. Bentuk filter yang paling umum adalah filter sinkronisasi, yang menerapkan kebijakan sinkronisasi untuk mengontrol akses ke fungsi anggota instans alokator blok lain. <alokator> menyediakan filter sinkronisasi berikut:
<alokator> juga menyediakan filter rts_alloc, yang menyimpan beberapa instans alokator blok dan menentukan instans mana yang akan digunakan untuk alokasi atau dealokasi pada runtime alih-alih pada waktu kompilasi. Ini digunakan dengan pengkompilasi yang tidak dapat mengkompilasi pengikatan ulang.
Kebijakan sinkronisasi menentukan bagaimana instans alokator menangani permintaan alokasi dan alokasi serentak dari beberapa utas. Kebijakan paling sederhana adalah meneruskan semua permintaan langsung ke objek cache yang mendasar, meninggalkan manajemen sinkronisasi kepada pengguna. Kebijakan yang lebih kompleks bisa menggunakan mutex untuk membuat serialisasi akses ke objek cache yang mendasar.
Jika kompilator mendukung kompilasi aplikasi berulir tunggal dan multi-utas, filter sinkronisasi default untuk aplikasi utas tunggal adalah sync_none
; untuk semua kasus lainnya adalah sync_shared
.
Templat cache_freelist
cache mengambil argumen kelas maks, yang menentukan jumlah maksimum elemen yang akan disimpan dalam daftar gratis.
<alokator> menyediakan kelas maks berikut:
Makro
Makro | Deskripsi |
---|---|
ALLOCATOR_DECL | Menghasilkan templat kelas alokator. |
CACHE_CHUNKLIST | Menghasilkan stdext::allocators::cache_chunklist<sizeof(Type)> . |
CACHE_FREELIST | Menghasilkan stdext::allocators::cache_freelist<sizeof(Type), max> . |
CACHE_SUBALLOC | Menghasilkan stdext::allocators::cache_suballoc<sizeof(Type)> . |
SYNC_DEFAULT | Menghasilkan filter sinkronisasi. |
Operators
Operator | Deskripsi |
---|---|
operator!= (<alokator>) | Pengujian untuk ketidaksetaraan antara objek alokator dari kelas tertentu. |
operator== (<alokator>) | Pengujian untuk kesetaraan antara objek alokator dari kelas tertentu. |
Kelas
Kelas | Deskripsi |
---|---|
allocator_base | Menentukan kelas dasar dan fungsi umum yang diperlukan untuk membuat alokator yang ditentukan pengguna dari filter sinkronisasi. |
allocator_chunklist | Menjelaskan objek yang mengelola alokasi penyimpanan dan membebaskan objek menggunakan cache jenis cache_chunklist. |
allocator_fixed_size | Menjelaskan objek yang mengelola alokasi penyimpanan dan membebaskan objek jenis Type menggunakan cache jenis cache_freelist dengan panjang yang dikelola oleh max_fixed_size. |
allocator_newdel | Menerapkan alokator yang menggunakan penghapusan operator untuk membatalkan alokasi blok memori dan operator baru untuk mengalokasikan blok memori. |
allocator_suballoc | Menjelaskan objek yang mengelola alokasi penyimpanan dan membebaskan objek jenis Type menggunakan cache jenis cache_suballoc. |
allocator_unbounded | Menjelaskan objek yang mengelola alokasi penyimpanan dan membebaskan objek jenis Type menggunakan cache jenis cache_freelist dengan panjang yang dikelola oleh max_unbounded. |
allocator_variable_size | Menjelaskan objek yang mengelola alokasi penyimpanan dan membebaskan objek jenis Type menggunakan cache jenis cache_freelist dengan panjang yang dikelola oleh max_variable_size. |
cache_chunklist | Menentukan alokator blok yang mengalokasikan dan membatalkan alokasi blok memori dengan satu ukuran. |
cache_freelist | Menentukan alokator blok yang mengalokasikan dan membatalkan alokasi blok memori dengan satu ukuran. |
cache_suballoc | Menentukan alokator blok yang mengalokasikan dan membatalkan alokasi blok memori dengan satu ukuran. |
daftar bebas | Mengelola daftar blok memori. |
max_fixed_size | Menjelaskan objek kelas maks yang membatasi objek daftar bebas ke panjang maksimum tetap. |
max_none | Menjelaskan objek kelas maks yang membatasi objek daftar bebas hingga panjang maksimum nol. |
max_unbounded | Menjelaskan objek kelas maks yang tidak membatasi panjang maksimum objek daftar bebas. |
max_variable_size | Menjelaskan objek kelas maks yang membatasi objek daftar bebas dengan panjang maksimum yang kira-kira sebanding dengan jumlah blok memori yang dialokasikan. |
rts_alloc | Templat kelas rts_alloc menjelaskan filter yang menyimpan array instans cache dan menentukan instans mana yang akan digunakan untuk alokasi dan dealokasi pada runtime alih-alih pada waktu kompilasi. |
sync_none | Menjelaskan filter sinkronisasi yang tidak menyediakan sinkronisasi. |
sync_per_container | Menjelaskan filter sinkronisasi yang menyediakan objek cache terpisah untuk setiap objek alokator. |
sync_per_thread | Menjelaskan filter sinkronisasi yang menyediakan objek cache terpisah untuk setiap utas. |
sync_shared | Menjelaskan filter sinkronisasi yang menggunakan mutex untuk mengontrol akses ke objek cache yang dibagikan oleh semua alokator. |
Persyaratan
Header:<alokator>
Namespace: stdext
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk