Попытка уменьшить размер выделения памяти в отладочных компиляциях для С++

У меня есть программное обеспечение, которое скомпилировано в режиме отладки для простоты поддержки (получение файлов дампа и т. д.). Версия Visual Studio 2008.

Мы заметили, что в результате выделение памяти приводит к огромным накладным расходам. Каждое выделение памяти (даже одного указателя), выполняемое при определении DEBUG, берет с собой большой заголовок, идентифицирующий выделяемый файл, строку и т. д.

Мы пытаемся оставаться в режиме DEBUG и при этом уменьшить накладные расходы. Кажется, что определение _AFX_NO_DEBUG_CRT должно помочь, но его определение на уровне проекта или в нашем файле stdafx.h приводит к длинному списку ошибок компиляции:

c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtls_.h(66): ошибка C2059: синтаксическая ошибка: '__asm' c:\program files (x86)\microsoft visual studio 9.0\ vc\atlmfc\include\afxtls_.h(66): ошибка C2143: синтаксическая ошибка: отсутствует ')' перед '{' ....

О той же ошибке сообщается в разделе: # define _AFX_NO_DEBUG_CRT вызывает поток ошибок компиляции, но требование создавать собственный новый здесь не актуально, и я не нашел там решения.

Другая альтернатива, которую я видел в сообщениях, - это игра с _CrtSetDbgFlag - но это, похоже, просто для того, чтобы избежать записи информации в кучу - но все же выделяет для нее память - это не то, что мы ищем.

Есть идеи?


person Rami Jaschek    schedule 17.06.2015    source источник
comment
возможный дубликат #define _AFX_NO_DEBUG_CRT вызывает поток ошибки компиляции   -  person user1    schedule 17.06.2015
comment
кстати, я не понимаю, почему вы не можете использовать сборку релиза вместо этого. Включите генерацию PDB (параметр «Создать отладочную информацию») в настройках проекта. Не распространяйте файл PDB.   -  person user1    schedule 17.06.2015
comment
Тогда вам не нужно беспокоиться о прослушивании из-за выделения памяти, все хорошо оптимизировано в сборке релиза.   -  person user1    schedule 17.06.2015
comment
Спасибо за подсказки. Что касается другого поста - да, это та же проблема, но у меня нет ограничений на попытки предоставить свои собственные новые и удалить, просто хочу избежать накладных расходов на блок CRT - поэтому я надеялся, что кто-нибудь может помочь меня (ни один из ответов не дал решения). Что касается перехода к релизу — это огромное изменение, которого мы пытаемся избежать (поскольку оно изменит многие модели поведения) и затруднит отладку. Полезно знать об опции генерации PDB.   -  person Rami Jaschek    schedule 17.06.2015


Ответы (1)


#define _CRTDBG_MAP_ALLOC

Из MSDN оператор #define сопоставляет базовые версии функций кучи CRT с соответствующими отладочными версиями. Включая crtdbg.h, вы сопоставляете функции malloc и free с их отладочными версиями, _malloc_dbg и _free_dbg, которые отслеживают выделение и освобождение памяти. Это то, чего вы хотите избежать. Это сопоставление происходит только в отладочной сборке (в которой определен _DEBUG). Релизные сборки используют обычные функции malloc и free.

Чтобы служить вашей цели, просто #undef _CRTDBG_MAP_ALLOC.

Перейдите к настройкам проекта Visual Studio -> Настройки отладки, перейдите к настройкам препроцессора C/C++, добавьте макрос _CRTDBG_MAP_ALLOC в разделе «Отменить определения препроцессора».

Вы должны быть в состоянии сгенерировать исполняемый файл DEBUG, который не будет генерировать подслушивание во время выделения памяти во время выполнения.

person user1    schedule 17.06.2015
comment
Я пробовал это (определение, которое я нашел, было недостаточно продвинутым), но я не вижу изменений в размере выделения памяти или в функции при отладке. Я все еще оказываюсь внутри: void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine) - person Rami Jaschek; 17.06.2015
comment
@RamiJaschek Я предполагаю, что ключ в том, чтобы отменить определение вещи достаточно рано и убедиться, что она не определена впоследствии - лучше всего смотреть на предварительно обработанные файлы. - person sharptooth; 17.06.2015
comment
Есть ли способ сделать это раньше, чем определить его на уровне проекта? Я попытался добавить это также в свой файл Stdafx.h - безрезультатно. По сути, я тестирую это с помощью очень простого файла, сгенерированного визуальной студией, где я добавил только простой основной объект, выделяющий кучу объектов. Объект, который я выделяю, занимает всего несколько байтов, но я трачу около 70 байт на одно выделение. Это очень простой, минимальный проект. - person Rami Jaschek; 17.06.2015
comment
@RamiJaschek Я не знаю, как сделать это раньше, но когда мне нужно было что-то подобное, я сделал это одной из первых строк внутри stdafx.h. Вполне возможно, что символ будет определен позже в некоторых других заголовках, которые вы включаете. Просмотр предварительно обработанных файлов может помочь локализовать проблему. - person sharptooth; 17.06.2015