Eksperymentuję z aktualizowaniem naszego podzielonego na pamięć bloku pamięci, aby wykorzystać cechy typu C++ 11.Czy globalny nowy operator może zostać nadpisany na podstawie cech typu przydzielonego obiektu?
Obecnie możliwe jest, aby zmusić żadnego podziału dowolnego obiektu w dowolnym miejscu, aby być wysłane do prawidłowego basen nadrzędnymi the global new operator w tradycyjny sposób, np
void* operator new (std::size_t size)
{ // if-cascade just for simplest possible example
if (size <= 64) { return g_BlockPool64.Allocate(); }
else if (size <= 256) { return g_BlockPool256.Allocate(); }
// etc .. else assume arguendo that we know the following will work properly
else return malloc(size);
}
w wielu przypadkach możemy dalej, jeśli poprawić wydajność obiekty mogą być wysyłane do różnych pul w zależności od cech typu, takich jak is_trivially_destructible
. Czy możliwe jest stworzenie nowego globalnego operatora, który jest świadomy przydzielonego typu, a nie tylko żądanego rozmiaru? Coś równoważne
template<class T>
void *operator new(size_t size)
{
if (size < 64)
{ return std::is_trivially_destructible<T>::value ?
g_BlockPool64_A.Allocate() :
g_BlockPool64_B.Allocate(); } // etc
}
przesłanianie użytkownik Nowy operator w każdej klasie nie będzie tu pracować; naprawdę potrzebujemy tego, aby automatycznie pracować dla każdej alokacji w dowolnym miejscu. Nowe miejsce docelowe również nie działa: wymaganie każdego przydziału wygląda tak, jakby było zbyt niewygodne i ludzie zapomnieli go użyć.
Schludny pomysł. Chociaż w jaki sposób bycie zniszczalnym pomaga menedżerowi pamięci? Menedżer nie dba o konstrukcję ani zniszczenie. – GManNickG
@GManNickG Jeśli wszystkie obiekty ulegające zniszczeniu trywialnie zostaną umieszczone w tej samej puli, możemy zwolnić je masowo, po prostu odrzucając stronę pamięci i nie wywołując w ogóle żadnych destruktorów. Jest to jedno wywołanie systemu operacyjnego zamiast milionów deallocations. Przydatne, gdy wszystkie alokacje dla kawałka poziomu idą do bloku i można po prostu wyrzucić przedmiot za burtę, opuszczając ten obszar. Istnieją już inne mechanizmy, które uniemożliwiają ludziom trzymanie wskaźników w tym bloku po ich życiu. – Crashworks
Nie. Ponadto 'return :: new (size);' to nieskończona rekursja. – aschepler