2012-02-17 9 views
5

Se ha formulado una pregunta sobre whether namespace and folder structure would affect performance of an assembly in C#. Las respuestas fueron muy útiles, pero específicas para C# y CLR.¿Las carpetas y espacios de nombres afectarán el rendimiento en C++ y multiplataforma?

¿Cómo afectará el espacio de nombre y la estructura de carpetas el rendimiento de un conjunto si está escrito en C++ con gcc? ¿Cuál es la situación en otros sistemas operativos, como Linux o Mac OS?

Si hay problemas de rendimiento importantes, ¿qué debo hacer o evitar para maximizar el rendimiento?

Respuesta

8

Ni la jerarquía de su directorio ni los espacios de nombres afectarán su código compilado. El código que generará tu compilador será el mismo. Esto aplica para todos los compiladores y todos los sistemas operativos.

+0

Muy sencillo gracias :-) –

+1

No es 100% correcto que los espacios de nombres no afecten el rendimiento. Usar un espacio de nombre anónimo puede mejorar el rendimiento en tu código. Ver http://stackoverflow.com/a/25565298/351771 – xioxox

8

Para ampliar un poco en lo que dijo Kyle:

espacios de nombres no son más que una forma sintáctica para el usuario y el compilador de poner nombres en diferentes cubos. Existen para permitirle usar nombres más comunes y apropiados para las cosas sin tener que preocuparse por los conflictos con otra persona. std::vector es un tipo diferente de una clase matemática vector. Pueden compartir el mismo nombre siempre que estén en diferentes espacios de nombres.

En lo que respecta al compilador, una función en un espacio de nombres no es diferente de una función en cualquier otro lado. Simplemente tiene un nombre gracioso. De hecho, a los compiladores se les permite la libertad de hacer lo que se llama "creación de nombres": cuando el compilador ve std::vector<int>, realmente puede convertir eso en algo como __std~~vector~t~~int32_t~~__ o lo que sea. El algoritmo de manipulación se elige para que ningún nombre definido por el usuario en el espacio de nombre global pueda coincidir con el nombre utilizado por el manipulador del espacio de nombres. Por lo tanto, todos los nombres con ámbito de espacio de nombres están separados de los nombres en otros espacios de nombres, incluso el global.

Básicamente, el primer paso en el proceso de compilación es efectivamente eliminar espacios de nombres. Por lo tanto, los pasos posteriores del compilador no tienen ni idea de en qué espacio de nombres está incluido algo. Por lo tanto, no pueden generar código a partir de él. Y así, los espacios de nombres no pueden tener ningún efecto en la velocidad de ejecución del código compilado.

Carpetas ... no se puede posiblemente materia. Después de la compilación, obtienes un único ejecutable, biblioteca o DLL. Si un compilador alguna vez hizo cualquier generación de código basada en la ubicación de los archivos fuente, sería recomendable evitar ese compilador como la plaga. Los escritores del compilador tendrían que estar controlando a sus usuarios para que eso suceda.

+1

Hay una pequeña excepción a esa declaración de la carpeta; las variables en los espacios de nombres sin nombre se destruyen de tal manera que su nombre interno es único para cada archivo fuente. Eso significa que 'foo' de file1.cpp debe ser distinto de' foo' en file2.cpp, y también de 'foo' en subdir/file1.cpp. Por lo tanto, esperarías nombres destrozados como 'subdir__file1__foo'. – MSalters

+0

Sin embargo, puede haber bastante diferencia en situaciones específicas entre 'ld * .o' y' ld b.o a.o', ya que esas dos llamadas dan como resultado un diseño de icache diferente. Aunque eso solo está indirectamente influenciado por la estructura de la carpeta (y no tiene nada que ver con el compilador, sino con el enlazador, por lo que es un poco OT aunque bastante poco intuitivo) – Voo

+0

@NicolBolas Gracias; ¡Tu respuesta es muy informativa! :-RE –

Cuestiones relacionadas