MSVC utiliza una implementación muy pesado de iteradores controladas en versiones de depuración, que otros ya han discutido, por lo que ganó' t repítalo (pero comience allí)
Otra cosa que podría interesarle es que su "compilación de depuración" y "compilación de versión" probablemente impliquen cambiar (al menos) 4 configuraciones que solo están relacionadas de manera vaga.
- Generando un archivo .pdb (cl/Zi y enlace/DEBUG), que permite la depuración simbólica. Es posible que desee agregar/OPT: ref a las opciones del enlazador; el vinculador elimina funciones sin referencia cuando no está haciendo un archivo .pdb, pero con el modo/DEBUG las mantiene todas (ya que los símbolos de depuración las referencian) a menos que lo agregue explícitamente.
- Utilizando una versión de depuración de la biblioteca C runtime (probablemente MSVCR * D.dll, pero depende del tiempo de ejecución que esté usando). Esto se reduce a/MT o/MTd (o algo más si no se utiliza el tiempo de ejecución DLL)
- Desactivación de las optimizaciones del compilador (/ OD)
- establecer el preprocesador #defines depuración o NDEBUG
Estos se puede cambiar de forma independiente. El primero no cuesta nada en el rendimiento del tiempo de ejecución, aunque agrega tamaño. El segundo hace que una serie de funciones sea más costosa, pero tiene un gran impacto en malloc y libre; las versiones de tiempo de ejecución de depuración tienen cuidado de "envenenar" la memoria que tocan con los valores para borrar los errores de datos no inicializados. Creo que con las implementaciones MSVCP * STL también elimina toda la agrupación de asignaciones que normalmente se realiza, de modo que las filtraciones muestran exactamente el bloque que se podría pensar y no un trozo de memoria más grande que ha estado subasignando; eso significa que hace que más llamadas a malloc sean mucho más lentas. El tercero; bueno, ese hace muchas cosas (this question tiene una buena discusión sobre el tema). Desafortunadamente, es necesario si quieres que un solo paso funcione sin problemas. El cuarto afecta a muchas bibliotecas de varias maneras, pero lo más notable es que compila o elimina assert() y amigos.
Así que podría considerar hacer una compilación con una combinación menor de estas selecciones. Aprovecho mucho las compilaciones que usan símbolos (/ Zi y link/DEBUG) y afirma (/ DDEBUG), pero aún están optimizadas (/ O1 o/O2 o lo que sea que uses) pero con punteros de stack stack guardados para borrar trazas inversas (/ Oy-) y utilizar la biblioteca de tiempo de ejecución normal (/ MT). Esto se realiza cerca de mi compilación de lanzamiento y es semi-depurable (las trazas inversas son buenas, el paso simple es un poco raro en el nivel de la fuente, el nivel de ensamblaje funciona bien por supuesto). Puede tener todas las configuraciones que desee; simplemente clone su versión uno y active las partes de la depuración que parezcan útiles.
Usted ha escrito obviamente nunca un juego con STL. El problema no son los algoritmos de los juegos, es la sobrecarga stl. Cuando stl no está optimizado, llama como 100 funciones cuando estaría completamente en línea y esa sobrecarga mata la velocidad de fotogramas del juego. – Tod
He escrito varios juegos con STL, pero quizás no en la misma escala que tienes; No he encontrado que sea un problema (pero imagine que es posible) – MarkR