La regla es que las variables se deben establecer antes de que se usen.
No no tiene que inicializarlos explícitamente en la creación si sabe que los va a configurar en otro lugar antes de su uso.
Por ejemplo, el código siguiente es perfectamente válido:
int main (void) {
int a[1000];
: :
for (int i =0; i < sizeof(a)/sizeof(*a); i++)
a[i] = i;
: :
// Now use a[whatever] here.
: :
return 0;
}
En ese caso, es un desperdicio para inicializar la matriz en el punto de su creación.
En cuanto a si hay una penalización de rendimiento, depende parcialmente de dónde se define su variable y parcialmente en el entorno de ejecución.
El estándar C garantiza que las variables definidas con duración de almacenamiento estático (ya sea a nivel de archivo o como estática en una función) se inicializan primero en un patrón de bits de todos los ceros y luego se establecen en sus respectivos valores inicializados.
Hace no mandato cómo se realiza ese segundo paso. Una forma típica es hacer que el compilador cree la variable inicializada y colocarla en el ejecutable para que se inicialice en virtud del hecho de que se cargó el ejecutable. Esto no tendrá ningún impacto en el rendimiento (para la inicialización, obviamente, tendrá algún impacto en la carga del programa).
Por supuesto, una implementación puede desear ahorrar espacio en el ejecutable e inicializar esas variables con código (antes de llamar a main). Este tendrá y tendrá un impacto en el rendimiento, pero es probable que sea minúsculo.
En cuanto a las variables con duración de almacenamiento automático (variables locales y similares), nunca se inicializan implícitamente a menos que se les asigne algo, por lo que también habrá una penalización de rendimiento para eso. Por "no inicializado de forma implícita", me refiero al segmento de código:
void x(void) {
int x[1000];
...
}
se traducirá en x [] con valores indeterminados. Pero desde:
void x(void) {
int x[1000] = {0};
}
puede simplemente dar lugar a una operación de tipo memcpy 1000-número entero (probable memset más para ese caso), este será probable que sea rápido también. Solo debe tener en cuenta que la inicialización ocurrirá cada vez que se llama a esa función.
Su ejemplo no anula toda la matriz, solo el primer elemento ... –
En realidad, * hace * anula toda la matriz. – paxdiablo
El ejemplo inicializa el primer elemento de la matriz con un '\ 0' específico y todos los demás con un '\ 0' predeterminado. El código 'char a [4] = {'A'};' pone 'A' en un [0], '\ 0' en un [1] ... – pmg