Дизайн для области выделения памяти - PullRequest
4 голосов
/ 03 апреля 2012

Я читал разные статьи по управлению памятью, готовясь к тому, как я хочу, чтобы моя архитектура работала, и я больше всего беспокоился о том, как распределители будут использоваться, создаваться и обрабатываться по всей базе кода. Одна из проблем заключается в том, что мой дизайн всегда имеет распределитель (и) в глобальном масштабе, поскольку у меня нет типичного одноэлементного проекта, содержащего распределители, у них нет реального места для жизни. Я бы не хотел использовать для этого глобальные переменные из-за всех проблем, которые обычно возникали при использовании глобальных переменных.

Это привело меня к созданию чего-то такого, как

void* operator new(size_t size, uint32_t type)
{
    return gAllocator.Alloc(size, type);
 }

Это приведет к тому, что в заголовочном файле будет просто новое определение с объявлением в .cpp. Этот файл .cpp будет иметь gAllocator, только в файле .cpp (и может быть доступен на месте, за исключением нового вызова.

Если бы мой дизайн был таким, будет ли gAllocator глобальной переменной, если нет, то к какому типу переменных она будет относиться? Что, если это было в пределах только пространства имен?

1 Ответ

1 голос
/ 03 апреля 2012

Кажется, простой глобал - это то, что вы хотите. Для обзора, в C ++ глобальная (или одиночная) должна быть локальной static переменной в inline функции.

class myAllocator {
public:
    static myAllocator &getDefaultInstance() {
        static myAllocator theInstance( parameters );
        return theInstance;
    }
};

Таким образом, объект инициализируется при первом использовании. Если вы используете типовое определение объявления заголовка + .cpp, порядок инициализации по отношению к другим глобальным переменным не определен, что может привести к непредсказуемым последствиям. («Фиаско статического порядка инициализации».)

...