2011-08-31 18 views
6

¿Hay alguna diferencia entre, por ejemploDiferencia entre array [n] y array []?

int array[]={1, 2, 3, 4, 5}; 

y,

int array[5]={1, 2, 3, 4, 5}; 

compilador necesita para calcular el número de elementos por sí mismo para el primer caso, y que puede tomar un poco de tiempo ({...} de 1234332534 elementos), entonces el segundo caso es eficiente que el primero?

+0

"array of 1234332534 elements" - La asignación de aproximadamente 4 GB (1.200 millones de ints) en la pila puede ser un problema. Los tamaños de pila habituales son del orden de pocos megabytes. Aparte de eso, no hay ninguna razón para usar un método sobre el otro, ya que si hay alguna sobrecarga, solo ocurre en el momento de la compilación de todos modos. – Damon

+4

El tiempo necesario para "contar" los elementos será imperceptible en relación con el resto de la compilación; de hecho, * debe * contar incluso en la segunda forma de todos modos, creo (para informar un error), y en cualquier caso, procesará la misma cantidad de elementos. 'int arr [2] = {1, 2, 3};' - errm? –

Respuesta

5

No hay diferencia, siempre que el conteo de elementos explícitos entre [] sea el mismo que el número de inicializadores entre {}.

La pregunta sobre la "eficiencia" es discutible. El tamaño de la matriz se determina en tiempo de compilación, lo que significa que no tiene ningún impacto en la eficiencia del código. Y como en cualquier caso el compilador tendrá que analizar la lista de inicializadores de todos modos, no tiene un impacto real en la eficacia de la compilación.

+2

El recuento de elementos inicializados puede ser menor que el número en '[]'. Es un error si hay más. – wallyk

+0

@wallyk: Bueno, nunca dije que el número * tiene * para ser el mismo. Dije: * no hay diferencia * si el número es el mismo. Si el número en '[]' es mayor que habrá una diferencia, ya que forzará la creación de elementos extra inicializados por defecto (o cero inicializados en C). – AnT

8

Esta declaración de matriz:

int array[] = {1, 2, 3, 4, 5}; 

es exactamente el mismo que:

int array[5] = {1, 2, 3, 4, 5}; 

El número de elementos se calcula en tiempo de compilación, así que no hay coste de tiempo de ejecución asociado con eso.

La ventaja de la primera declaración es que no requiere que el programador cuente manualmente el número de elementos, por lo que es una declaración de matriz más eficiente en ese sentido.

1

Ninguna diferencia, excepto que usted, el programador, no tiene que determinar cuántos elementos hay en la matriz. El compilador todavía va a contar los elementos para asignar la cantidad adecuada, por lo que ambos toman el compilador el mismo período de tiempo para compilar.

2
  1. No hay diferencia en el resultado final; aún así, la primera forma es más fácil de escribir y mantener, porque no tiene que contar manualmente los elementos.
  2. El compilador probablemente tenga que contar los elementos de todos modos: debe detectar si son más porque es un error de compilación, y si son menos, los demás deben inicializarse a cero.
  3. De todos modos, tal recuento se realiza en tiempo de compilación, por lo que no hay impacto en el rendimiento del ejecutable generado.
  4. En general, nunca se tienen matrices muy grandes creadas en la pila o como globales (porque generalmente las asignaciones de grandes pilas fallan, y las grandes matrices como globales darán como resultado enormes ejecutables ).
  5. E incluso si logró que el compilador aceptara una matriz estática/local de 1234332534 elementos, el recuento de los elementos probablemente será el último de los problemas de rendimiento de esta compilación.

†. por otro lado, las grandes matrices globales son la manera en que los recursos binarios a menudo se incluyen en el firmware para que se muestren en dispositivos integrados. Pero no creo que nadie considere este método de fuerza bruta para algo más grande que varios MB.

+0

+1 para # 5. :) (en 15 caracteres también) –

0

En el segundo caso, el precompilador detectará un error si se da un número de valores incorrecto para inicializar la memoria. Eso es básicamente todo.

+2

No es cierto. El número en '[]' s puede ser más grande que el tamaño de la lista de inicializadores; en cuyo caso se supone que el área restante se inicializa a cero. –

+0

Está permitido proporcionar menos elementos que el tamaño de la matriz, los demás elementos tienen cero inicialización. Y el precompilador no está involucrado aquí, el comprobador lo hace el compilador real. –