Я экспериментирую с обновлением нашего объединенного блока распределения памяти с фиксированным блоком, чтобы использовать возможности типа C++ 11.Можно ли переопределить глобальный новый оператор на основе свойств типа выделенного объекта?
В настоящее время можно заставить любое выделение любого объекта в любом месте, чтобы быть отправленной в правильный пул путем переопределения the global new operator традиционным способом, например
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);
}
Во многих случаях мы могли бы улучшить производительность еще больше, если объекты могут быть отправлены в разные пулы в зависимости от типов типов, таких как is_trivially_destructible
. Возможно ли создать шаблонный глобальный новый оператор, который знает о распределенном типе, а не только запрошенный размер? Что эквивалентно
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
}
Переопределение нового оператора члена в каждом классе не будет работать здесь; мы действительно нуждаемся в этом, чтобы автоматически работать для любого размещения в любом месте. Размещение нового не будет работать: требуя каждый Alloc выглядеть
Foo *p = new (mempool<Foo>) Foo();
слишком громоздким и люди забывают использовать его.
Уютная идея. Хотя как тривиально разрушаемая помощь менеджеру памяти? Менеджер не заботится о строительстве и разрушении. – GManNickG
@GManNickG Если все тривиально разрушаемые объекты попадают в один и тот же пул, мы можем отменить их в массовом порядке, просто разделив страницу памяти и вообще не называя каких-либо деструкторов. Это один вызов ОС вместо миллионов освобождений. Полезно, когда все распределения для куска уровня идут в блок, и вы можете просто выбросить вещь за борт, покидая эту область. Уже существуют другие механизмы, позволяющие людям удерживать указатели в этом блоке за всю их жизнь. – Crashworks
Нет. Кроме того, 'return :: new (size);' бесконечная рекурсия. – aschepler