1) В стандарте C ++ 03 потоки не упоминаются. Однако на всех известных мне платформах с поддержкой потоков распределитель памяти по умолчанию (new
и delete
) является потокобезопасным.
Изменить: в общем, если что-то не помечено как потокобезопасное, вы должны предполагать, что это не так, особенно когда есть неявные глобальные данные (например, структуры управления кучей в диспетчере памяти). Я прочитал несколько комментариев на другом форуме о эта библиотека MMGR не является потокобезопасной.
2) Оператор запятой в макросе отбрасывает результат слева, поэтому результатом выражения (m_setOwner(...), false)
всегда является false
.
Изменить: этот синтаксис используется в MMGR для регистрации распределения памяти перед переходом к реальному распределению. Оператор запятой используется, чтобы синтаксис макроса new
не изменился. Макросы препроцессора - это простой текстовый механизм поиска и замены. Любое использование new
в вашем коде будет компилироваться с этой библиотекой MMGR или без нее. Просто при использовании MMGR будет регистрироваться выделение памяти, что полезно для отладки!
3) Какой «резервуар»? Вы про кучу имеете в виду? Откуда у вас этот термин?
Изменить: диспетчер памяти на уровне приложения - это просто интерфейс диспетчера памяти на системном уровне. Следовательно, он должен попросить систему выделить большие страницы памяти. Резервуар в данном случае, похоже, является названием механизма, который предварительно выделяет некоторые из этих больших страниц, так что следующие несколько выделений гарантированно будут успешными. В основном это оптимизация, поскольку вы амортизируете стоимость одного (дорогостоящего) распределения на уровне системы по нескольким распределениям на уровне приложения.
4) Да, «ANSI» в данном контексте относится к стандарту C ++ 03. Правильный способ обратиться к нему сейчас - использовать стандартный номер ISO. Не стесняйтесь погуглить.
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. Да, можно подумать об этом в этих темах, хотя ваша платформа, скорее всего, не будет вызывать malloc()
в operator new
в режиме «выпуска».
person
André Caron
schedule
24.02.2011