MSVC использует очень тяжелую реализацию проверенных итераторов в отладочных сборках, о которых другие уже говорили, поэтому я не буду повторять это (но начну там)
Еще одна вещь, которая может вас заинтересовать, заключается в том, что ваши «отладочная сборка» и «сборка выпуска», вероятно, включают в себя изменение (как минимум) 4 параметров, которые имеют слабую связь.
- Создание файла .pdb (cl / Zi и link / DEBUG), который позволяет проводить символьную отладку. Вы можете добавить / OPT: ref к параметрам компоновщика; компоновщик удаляет функции, на которые нет ссылок, когда не создает файл .pdb, но в режиме / DEBUG он сохраняет их все (так как символы отладки ссылаются на них), если вы не добавите это точно.
- Использование отладочной версии библиотеки времени выполнения C (возможно, MSVCR * D.dll, но это зависит от используемой среды выполнения). Это сводится к / MT или / MTd (или что-то еще, если не использовать среду выполнения DLL)
- Отключение оптимизации компилятора (/ Od)
- установка препроцессора #defines DEBUG или NDEBUG
Они могут переключаться независимо. Первый ничего не стоит в производительности во время выполнения, хотя он добавляет размер. Вторая делает ряд функций более дорогостоящими, но оказывает огромное влияние на malloc и free; версии отладочной среды стараются «отравить» память, к которой они обращаются, значениями, чтобы очистить неинициализированные ошибки данных. Я полагаю, что с реализациями MSVCP * STL это также устраняет все пулы распределения, которые обычно выполняются, так что утечки показывают именно тот блок, который вы думаете, а не какой-то больший кусок памяти, который он перераспределяет; это означает, что он делает больше вызовов malloc поверх них намного медленнее. Третий; хорошо, что каждый делает много вещей ( этот вопрос имеет хорошее обсуждение предмета). К сожалению, это необходимо, если вы хотите, чтобы пошаговый режим работал плавно. Четвертый затрагивает множество библиотек различными способами, но наиболее примечателен, он компилируется или удаляет assert () и друзей.
Так что вы можете подумать о том, чтобы сделать сборку с меньшей комбинацией этих вариантов. Я часто использую сборки, которые используют символы (/ Zi и link / DEBUG) и утверждения (/ DDEBUG), но все еще оптимизированы (/ O1 или / O2 или любые другие флаги, которые вы используете), но с указателями кадров стека, сохраненными для очистить трассировки (/ Oy-) и использовать обычную библиотеку времени выполнения (/ MT). Это работает близко к моей сборке релиза и является полуотладимым (обратные трассировки в порядке, пошаговое выполнение немного странно на уровне исходного кода; уровень сборки, конечно, работает нормально). Вы можете иметь сколько угодно конфигураций; просто клонируйте свой первый релиз и включите те части отладки, которые кажутся полезными.