MMGR Вопросы, использование кода и безопасность потоков

1) Является ли MMGR потокобезопасным?

2) Я надеялся, что кто-нибудь поможет мне разобраться в каком-нибудь коде. Я смотрю что-то, где используется макрос, но я не понимаю макрос. Я знаю, что он содержит вызов функции и проверку if, однако функция является недействительной. Как упаковка "(m_setOwner (FILE, _ LINE _, FUNCTION), false)" когда-либо изменяет типы возвращаемых данных?

#define someMacro (m_setOwner(__FILE__,__LINE__,__FUNCTION__),false) ? NULL : new ...
void m_setOwner(const char *file, const unsigned int line, const char *func);

3) В чем смысл водоема?

4) В строке 770 ("void * operator new (size_t reportSize)" есть строка "// ANSI говорит: запросы на выделение 0 байтов по-прежнему будут возвращать допустимое значение"

Кто / что такое ANSI в этом контексте? Имеются в виду стандарты?

5) Это больше похоже на стандарты C ++, но откуда берется «reportSize» для «void * operator new (size_t reportSize)»?

6) Это код, который действительно выполняет необходимое распределение? "au-> actualAddress = malloc (au-> actualSize);"


person chadb    schedule 24.02.2011    source источник
comment
Я отредактировал ваше сообщение, чтобы использовать выделение синтаксиса во фрагменте кода. См. Раздел справки справа при редактировании.   -  person André Caron    schedule 24.02.2011


Ответы (1)


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
comment
Извините, MMGR, о котором я говорю, - это MMGR от Nettle. Вот как выглядит заголовок codepad.org/BkBWySc3, и вот как выглядит cpp codepad.org/C8brGsZm - person chadb; 24.02.2011
comment
@chadb: Спасибо за уточнения. Я взглянул на код и отредактировал свой ответ. Надеюсь это поможет - person André Caron; 25.02.2011