Sé que esta es una pregunta que todo programador debe saber, pero no sé. Mucho tiempo sin programación C y he olvidado muchas cosas.Definición de una matriz estática en un archivo fuente C o C++
Mi pregunta es:
tengo tres enormes arreglos estáticos definidos dentro de un archivo de cabecera. Alguien me dijo que es mucho mejor declararlos como extern
en el archivo de encabezado y definirlos en un solo archivo de origen C o C++.
¿Cómo puedo hacer eso?
Aquí está mi archivo de cabecera:
#ifndef _TEMPLE_OBJECT_H_
#define _TEMPLE_OBJECT_H_
#define NUM_TEMPLE_OBJECT_VERTEX 10818
static const float TEMPLEVertices[NUM_TEMPLE_OBJECT_VERTEX * 3] = {...};
static const float TEMPLENormals[NUM_TEMPLE_OBJECT_VERTEX * 3] = {...};
static const float TEMPLETexCoords[NUM_TEMPLE_OBJECT_VERTEX * 3] = {...};
#endif
Si un uso un fichero fuente C++, podría necesitar para definir una clase?
ACTUALIZACIÓN:
Creo que el problema es:
Cada archivo de origen en el que los encabezados se incluyen (aunque sea indirectamente) generará su propia definición de los arreglos estáticos. No hay garantía de que el compilador/vinculador los optimice en una única definición, incluso en los archivos fuente donde no se utilizan. De hecho, en muchos casos el compilador no puede optimizarlos. Esto podría provocar que sus datos estáticos consuman una gran cantidad de espacio en disco, y posiblemente también memoria de tiempo de ejecución.
Gracias.
Shoud no debe ser el caso de GCC y optimice la compilación habilitada. Aquí hay información sobre "-fkeep-static-consts" del [https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html]https://gcc.gnu.org/onlinedocs/gcc/Optimize -Options.html "Emitir variables declaradas estáticas const cuando la optimización no está activada, incluso si las variables no están referenciadas. GCC habilita esta opción de forma predeterminada. Si desea forzar al compilador a verificar si se hace referencia a una variable , independientemente de si la optimización está activada o no, use la opción -fno-keep-static-consts." – Andy