Jest kilka powodów dla których możesz chcieć użyć innych niż domyślna strategii alokacji pamięci.
Niektóre z nich:
- potrzebujesz zaalokować dużą liczbę obiektór o równym rozmiarze
- potrzebujesz szybkie zwalnianie pamięci
- obchodzi Cię fragmentacja pamięci (w grze konsolowej lub systemie wbudowanym)
Specjalne konstruowanie obiektów
Czasami potrzebujesz wykonać alokację obiektu w specjalny sposób, tutaj krótka lista która wspomina specjalną składnię dla operatora "new":
nothrow: wykonanie "new" bez obsługi wyjątków
Zwykle w przypadku braku pamięci biblioteka standardowa generuje wyjątek std::bad_alloc. Jeśli zamiast tego chcesz wykorzystać swoją własną logikę warunkową, możesz użyć składni "nothrow":
MyClass *p;
p = new (std::nothrow) MyClass;
if (!p) {
cout << "Alokacja się nie powiodła!\n";
}
alokacja tablicy obiektów bez wywoływania konstruktora
W standardowych sytuacjach kiedy dynamicznie alokujesz tablicę obiektów wykorzystujesz składnię:
const size_t ARRAY_SIZE = 123;
MyClass *ptr = new MyClass[ARRAY_SIZE];
W takim przypadku dla każdego obiektu w tablicy wywoła się domyślny konstruktor. Jeśli zamiast tego chcesz wywołać konstruktor z jakimiś parametrami ale nie chcesz użyć malloc, możesz zaalokować tablicę używając globalnego operatora "new":
const size_t ARRAY_SIZE = 123;
MyClass *ptr = static_cast<MyClass *>(operator new[](sizeof(MyClass) * ARRAY_SIZE));
Teraz aby wywołać wybrany konstruktor na już zaalokowanej pamięci, musisz użyć konstruktora "w miejscu" dla każdego elementu tablicy - zobacz poniżej.
placement new - wywołaj konstruktor dla zaalokowanego obiektu
Jeśli musisz wywołać konstruktor dla obiektu który ma już zaalokowaną pamięć, używasz składni "placement new". Może to być użyteczne w wyspecjalizowanych alokatorach "arena" lub pulach obiektów.
const size_t ARRAY_SIZE = 123;
MyClass *ptr = static_cast<MyClass *>(operator new[](sizeof(MyClass) * ARRAY_SIZE));
size_t i = ARRAY_SIZE;
while (i-- > 0) {
// --> placement new, wywołuje konstruktor dla zaalokowanego obiektu wskazywanego przez ptr[i] z przykładowymi argumentami
new (ptr[i]) MyClass(12, 'a', "test");
// <--
}
Wyspecjalizowane rozwiązania dla alokacji
- Specyficzne alokatory
- To New, Perchance To Throw, part 1 - Herb Sutter, 2001
- To New, Perchance To Throw, part 2 - Herb Sutter, 2001
- nothrow new - Danny Kalev, 2003
- Overloading New in C++
- My Rant on C++'s operator new - David Mazieres
- Overloading operator new - część książki Bartosza Milewskiego "C++ In Action"
- Improving Performance with Custom Pool Allocators for STL - Anthony Aue, 2005
- Customized Allocators with Operator New and Operator Delete
- Building your own memory manager for C/C++ projects - Arpan Sen, Rahul Kumar Kardam, 2008
- CppCon 2015: Andrei Alexandrescu “std::allocator...”
- Boost.Pool
- używane do serii małych obiektów i szybkiego ich zwolnienia
- poradnik: Overview of the boost::pool library - Arpan Sen, 2008
- poradnik: Fast new and delete with Boost's pools
- Boost Flyweight Library
- alokacja pamięci dla wartości wykonana raz i przypisywanie referencji kolejnym instancjom
- Wzorzec Arena: My Rant on C++'s operator new - David Mazieres
- użyj do szybkiej dealokacji
- Scope Stack Allocation - Andreas Fredriksson, 2010
- użyj jeśli interesuje Cię fragmentacja pamięci
- Huge pages - zwiększone rozmiary strony pamięci wirtualnej w celu zwiększenia wydajności
- HugeTLBPage - kernel.org
- Hugepages - debian.org
- HugeTLB - Large Page Support in the Linux Kernel - R. Krishnakumar, 2008
Zastępniki malloc
- jemalloc - zoptymalizowane dla aplikacji wielowątkowych, używane w FreeBSD i Firefox
- TCMalloc - "Thread-Caching Malloc", część gperftools
- How tcmalloc Works - James Golick, 2013
- Hoard
- Hoard: A Scalable Memory Allocator for Multithreaded Applications - Emery Berger, 2007
- Lockless Memory Allocator
- NBmalloc
- streamflow
- Inside memory management - Jonathan Bartlett, 2004
Garbage collection w C++
- gotowe do użycia narzędzie: The Boehm-Demers-Weiser conservative C/C++ Garbage Collector
- kod: https://github.com/ivmai/bdwgc/
- Garbage Collection Synopsis, and C++ - Herb Sutter, 2011
- Why doesn't C++ have garbage collection? - Bjarne Stroustrup's FAQ
- Garbage collection ABI - C++11 FAQ, Bjarne Stroustrup
- "Garbage Collection: Algorithms for Automatic Dynamic Memory Management" - książka wg Richarda Jones'a, 1996
Zobacz również
- Przetwarzanie wieloprocesowe z C++ - poszukaj "pliki mapowane na pamięć"