Поскольку наше приложение имеет жесткую производительность и ограничения памяти, наши стандарты кодирования запрещают использование кучи по умолчанию и— т.е. malloc
, по умолчанию new
. Каждое распределение памяти должно выбирать один из нескольких конкретных распределителей; что-то вроде
// declared globally
void* operator new( size_t size, CustomAllocHeap* heap, const char* perpetrator_name )
{
return heap->Allocate( size, perpetrator_name );
}
// imagine a bunch of CustomAllocHeap declared globally or statically, thus
Vector* v = new( gPhysicsHeap, __FUNCTION__ ) Vector( 1.0f, 2.0f, 3.0f, 4.0f );
// or in a class
Thingy* p = new( this->LocalArenaHeap, __FUNCTION__ ) Thingy();
Несмотря на то, что мы сохранили хорошую дисциплину в этом коде, некоторые стандартные компоненты С++ (контейнеры, std::function
) скрытно обрабатывают кучу по умолчанию new
, что очень плохо.
Было бы неплохо отключить значение по умолчанию new
в некотором роде, так что любая строка кода, которая неявно приводит к распределению по умолчанию, сразу бросает ошибку компилятора. Это позволило бы сразу заметить эти вещи.
Очевидно, мы можем сделать new
ошибку выполнения, т.е.
void* operator new ( size_t ) { __debugbreak(); return NULL; }
но было бы гораздо лучше получить предупреждения об этом во время компиляции. Возможно ли это?
Наше приложение создано для фиксированной платформы (x64 с Visual Studio); переносимость не имеет значения.