2012-06-04 13 views
5

Tengo una matriz de int y tengo que inicializar esta matriz con el valor -1. Por ahora uso este ciclo:Método rápido para inicializar mi matriz

int i; 
int myArray[10]; 

for(i = 0; i < 10; i++) 
    myArray[i] = -1; 

¿Hay formas más rápidas?

Respuesta

5

La forma más rápida que conozco para el valor -1 (o 0) es memset:

int v[10]; 
memset(v, -1, 10 * sizeof(int)); 

De todos modos se puede optimizar el bucle de esta manera:

int i; 
for(i = 10; i--;) 
    v[i] = -1; 
+1

En máquinas de dos complementos. No funcionará en cosas exóticas como signo y magnitud. Pero dado que todo el mundo hoy en día es complemento de dos, sí. –

1

memset es muy rápido.

int arr[10]; 
memset(arr, -1, sizeof(arr)); 

Sin embargo, lo que tienes es probable que haya convertido en una llamada a Memset por un compilador de optimización de todos modos. Mire la salida de su conjunto para asegurarse, pero es muy poco probable que el bucle siga siendo un bucle cuando se compile.

2

En GNU C lo que puede hacer es:

int myArray[10] = {[0 ... 9] = -1}; 

La inicialización de una serie de elementos: http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

Y como nadie lo mencionó, en C portátil:

int myArray[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; 
+0

Gracias, solo en GNU C? – Nick

+0

@Nick Esto no es C sino una extensión de GNU a C (habilitada por defecto con gcc). – ouah

+2

Bien si no le importa que su código sea portátil. –

5

Si desea inicializar la matriz en el momento de la declaración con 0, puede utilizar: int a[10] = {0}; que es muy rápido. Pero si desea inicializar con algún otro valor o desea reinicializar su matriz con 0 en algún momento posterior del código, use: memset(a, -1, size_a); (o memset(a, 0, size_a); respectivamente) o un bucle. En mi opinión, siempre prefiero memset() al bucle porque memset() a menudo se optimiza para establecer palabras enteras en la memoria al valor de inicialización dado como su argumento en lugar de establecer bytes individuales.

Para las estadísticas, en mi instalación de Linux de 32 bits con 4 GB de memoria y procesador de 2,2 GHz * 2, se dan los tiempos de ejecución de cuatro tipos de códigos de inicialización de la matriz a continuación:

1). 0.002s

#include <string.h> 

#define SIZE 1000000 

int a[SIZE]; 

int main(void) 
{ 
    return 0; 
} 

2). 0.008s

#include <string.h> 

#define SIZE 1000000 

int main(void) 
{ 
    int a[SIZE] = {0}; 
    return 0; 
} 

3). 0,003s

#include <string.h> 

#define SIZE 1000000 

int main(void) 
{ 
    int a[SIZE]; 
    memset(a, -1, SIZE); 
    return 0; 
} 

4). 0.011s

#include <string.h> 

#define SIZE 1000000 

int main(void) 
{ 
    int a[SIZE]; 
    int i; 
    for(i = 0; i < SIZE; i++) 
     a[i] = -1; 
    return 0; 
} 
+0

El bucle de asignación simple se optimizará en una llamada a 'memset' por cualquier compilador de optimización. –

+0

Sí, con '-O2' o con' -O3', gcc 4.5.2 optimiza el bucle de asignación a 'memset()' -like assembly code. –

Cuestiones relacionadas