1) В стандарте C ++ 03 не упоминаются темы.Однако на всех платформах с поддержкой потоков, о которых я знаю, распределитель памяти по умолчанию (new
и delete
) является потокобезопасным.
Редактировать: В общем, если что-то не такпомеченные как поточно-ориентированные, следует предполагать, что это не так, особенно если существуют неявные глобальные данные (например, структуры управления кучей в диспетчере памяти).Я прочитал комментариев на другом форуме о том, что эта библиотека MMGR не является поточно-ориентированной.
2) Оператор запятой в макросе отбрасывает результат слеватаким образом, результат выражения (m_setOwner(...), false)
всегда равен false
.
Edit: Этот синтаксис используется в MMGR для регистрации распределения памяти перед переходом к реальному выделению.Оператор запятой используется таким образом, что синтаксис макроса new
не изменяется.Макросы препроцессора - это простой текстовый механизм поиска и замены.Любое использование new
в вашем коде будет компилироваться с или без этой библиотеки MMGR.Просто при использовании MMGR будет записываться распределение памяти, что полезно для отладки!
3) Что за «резервуар»?Вы имеете в виду кучу?Откуда вы взяли этот термин?
Редактировать: Диспетчер памяти на уровне приложений - это всего лишь интерфейс к диспетчеру памяти на системном уровне.Следовательно, он должен попросить систему выделить большие страницы памяти.Резервуар, в этом случае, кажется, является названием для механизма, который предварительно выделяет некоторые из этих больших страниц, так что следующие несколько выделений гарантированно будут успешными.Это в основном оптимизация, поскольку вы амортизируете стоимость однократного (дорогостоящего) выделения на уровне системы по нескольким выделениям на уровне приложения.
4) Да, «ANSI» в данном контексте относится кСтандарт С ++ 03.Правильный способ обозначить это сейчас - использовать стандартный номер ISO.Не стесняйтесь Google.
5) Указанный размер устанавливается компилятором.Когда вы пишете что-то вроде X* x = new X(...);
, компилятор логически «переписывает» это в эквивалентную форму:
X* x = static_cast<X*>(operator new(sizeof(X)));
new(x) X(...);
Первая строка выделяет достаточно памяти (sizeof(X)
- это значение, переданное в качестве аргумента reportedSize
дляoperator new
).Вторая строка вызывает конструктор класса X
для создания объекта в выделенном слоте памяти.
6) См. # 5.Да, можно подумать об этом в этих temrs, хотя ваша платформа, скорее всего, не будет вызывать malloc()
в operator new
в режиме «релиз».