MSVC использует очень тяжелом реализации проверяемых итераторы в отладочной версии, которые другие уже обсуждали, так что я выиграл» t повторить его (но начать там)
Еще одна интересная вещь, которая может вас заинтересовать, заключается в том, что ваша «сборка отладки» и «сборка релиза», вероятно, связаны с изменением (по крайней мере) 4 настроек, которые связаны только с нею.
- Создание файла .pdb (cl/Zi и link/DEBUG), что позволяет символически отлаживать. Вы можете добавить/OPT: указать опции компоновщика; компоновщик оставляет неиспользуемые функции, когда не создает файл .pdb, но с режимом/DEBUG он сохраняет их все (так как символы отладки ссылаются на них), если вы не добавите это явно.
- Использование отладочной версии библиотеки времени выполнения C (возможно, MSVCR * D.dll, но это зависит от того, какую рабочую среду вы используете). Это сводится к/т или/MTD (или что-то еще, если не с помощью DLL выполнения)
- Выключение оптимизаций компилятора (/ Od)
- установки препроцессор #defines DEBUG или NDEBUG
Эти могут переключаться независимо. Первое не стоит ничего в производительности во время выполнения, хотя добавляет размер. Второй делает ряд функций более дорогими, но оказывает огромное влияние на malloc и бесплатно; версии отладки во время выполнения стараются «отравить» память, которую они касаются значениями, чтобы очистить неинициализированные ошибки данных. Я считаю, что с реализациями MSVCP * STL он также устраняет все пулы распределения, которые обычно выполняются, так что утечки показывают именно тот блок, который вы думаете, а не какой-то более крупный фрагмент памяти, который он выделял; это означает, что он делает больше вызовов для malloc поверх них намного медленнее. Третий; хорошо, что он делает много вещей (this question имеет хорошее обсуждение темы). К сожалению, это необходимо, если вы хотите, чтобы одношаговый режим работал плавно. Четвертый затрагивает множество библиотек по-разному, но наиболее примечательно, что он компилирует или отменяет assert() и друзей.
Итак, вы можете подумать о создании сборки с некоторой меньшей комбинацией этих выборов. Я много использую сборки, которые используют символы (/ Zi и link/DEBUG), и утверждает (/ DDEBUG), но все еще оптимизирован (/ O1 или/O2 или любые флаги, которые вы используете), но с указателями фреймов стека очистить обратные трассы (/ Oy-) и использовать обычную библиотеку времени выполнения (/ MT). Это выполняется близко к моей сборке релизов и является полуотверждаемым (обратные трассировки прекрасны, одноступенчатая игра немного путается на исходном уровне, а уровень сборки отлично работает). Вы можете иметь как можно больше конфигураций; просто клонируйте свой релиз и включите все части отладки, которые вам кажутся полезными.
Вы никогда явно не писал игру с STL. Проблема заключается не в алгоритмах игр, а в надстройке stl. Когда stl не оптимизирован, он называет 100 функций, когда он будет полностью вложен и что накладные расходы убивают частоту кадров игры. – Tod 2009-09-23 20:26:48
Я написал несколько игр с STL, но, возможно, не в том же масштабе, что и у вас; Я не нашел, что это проблема (но представьте, что это возможно) – MarkR 2009-09-24 14:46:32