2012-06-04 12 views
5

Ich habe ein Array von Int und ich muss dieses Array mit dem Wert -1 initialisieren. Für jetzt benutze ich diese Schleife:Schnelle Methode, um mein Array zu initialisieren

int i; 
int myArray[10]; 

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

Es gibt schnellere Möglichkeiten?

Antwort

5

Der schnellste Weg ich für den Wert kennen -1 (oder 0) ist memset:

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

Auf jeden Fall können Sie die Schleife auf diese Weise optimieren:

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

Auf Zweierkomplementmaschinen. Wird nicht an exotischen Sachen wie Zeichen und Größenordnungen arbeiten. Aber da die ganze Welt heutzutage Zweierkomplement ist, ja. –

1

memset sehr schnell ist.

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

jedoch, was Sie haben es wahrscheinlich in einen Aufruf gedreht werden ohnehin durch eine Optimierung der Compiler memset. Schauen Sie sich Ihre Assembly-Ausgabe an, aber es ist sehr unwahrscheinlich, dass die Schleife beim Kompilieren eine Schleife bleibt.

2

In GNU C, was Sie tun können, ist:

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

eine Reihe von Elementen initialisieren: http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

Und niemand erwähnt es, in tragbaren C:

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

Danke, nur in GNU C? – Nick

+0

@Nick Dies ist nicht C, sondern eine GNU-Erweiterung zu C (standardmäßig aktiviert mit gcc). – ouah

+2

Gut, wenn es Ihnen nicht wichtig ist, dass Ihr Code portabel ist. –

5

Wenn Sie Willst du das Array zum Zeitpunkt der Deklaration mit 0 initialisieren, kannst du verwenden: int a[10] = {0}; was sehr schnell ist. Wenn Sie jedoch mit einem anderen Wert initialisieren oder das Array zu einem späteren Zeitpunkt im Code mit 0 initialisieren möchten, verwenden Sie: memset(a, -1, size_a); (oder memset(a, 0, size_a);) oder eine Schleife. Meiner Meinung nach immer memset() zu loopen, weil memset() oft optimiert wird, um ganze Wörter im Speicher auf den Initialisierungswert als sein Argument gegeben, anstatt einzelne Bytes zu setzen.

Für Statistiken, auf meinem 32-Bit-Linux-Installation mit 4 GB Speicher und 2,2 GHz * 2-Prozessor, die Laufzeiten von vier Arten von Initialisierungscodes Array sind unten angegeben:

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

Die einfache Zuweisungsschleife wird zu einem Aufruf von 'memset' durch jeden vernünftig optimierenden Compiler optimiert. –

+0

Ja, mit '-O2' oder mit '-O3' optimiert gcc 4.5.2 die Zuweisungsschleife zu 'memset()' - ähnlichem Assemblercode. –

Verwandte Themen