MMGR Вопросы, код использования и безопасность потоков - PullRequest
0 голосов
/ 24 февраля 2011

1) Безопасен ли поток MMGR?

2) Я надеялся, что кто-нибудь поможет мне понять какой-то код.Я смотрю на что-то, где используется макрос, но я не понимаю макрос.Я знаю, что он содержит вызов функции и проверку if, однако функция является функцией void.Как перенос "(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 * new (size_t сообщилSize)» «есть линия» // ANSI говорит: запросы на выделение 0 байтов будут по-прежнемуверните действительное значение "

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

5) Это больше стандартов C ++, но откуда берется" reportSize "для"void * operator new (size_t reportsSize)"?

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

1 Ответ

1 голос
/ 24 февраля 2011

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 в режиме «релиз».

...