2013-06-16 19 views
5

Ich versuche, die Auswirkungen des Zwischenspeicherns programmgesteuert mit dem folgenden Programm zu verstehen. Ich erhalte segfault mit dem Code. Früher habe ich GDB (kompiliert mit -g -O0) und fand, dass es Segmentierung Verwerfungen war aufSegmentierungsfehler beim Aufruf von clock()

start = clock() (first occourance) 

Bin ich etwas falsch? Der Code sieht gut aus für mich. Kann jemand auf den Fehler hinweisen?

#include <stdio.h> 
#include <sys/time.h> 
#include <time.h> 
#include <unistd.h> 

#define MAX_SIZE (16*1024*1024) 
int main() 
{ 
    clock_t start, end; 
    double cpu_time; 
    int i = 0; 
    int arr[MAX_SIZE]; 

    /* CPU clock ticks count start */ 
    start = clock(); 

    /* Loop 1 */ 
    for (i = 0; i < MAX_SIZE; i++) 
     arr[i] *= 3; 

    /* CPU clock ticks count stop */ 
    end = clock(); 

    cpu_time = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("CPU time for loop 1 %.6f secs.\n", cpu_time); 

    /* CPU clock ticks count start */ 
    start = clock(); 

    /* Loop 2 */ 
    for (i = 0; i < MAX_SIZE; i += 16) 
     arr[i] *= 3; 

    /* CPU clock ticks count stop */ 
    end = clock(); 

    cpu_time = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("CPU time for loop 2 %.6f secs.\n", cpu_time); 

    return 0; 
} 

Antwort

4

Versuchen zu ändern:

int arr[MAX_SIZE]; 

zu:

int *arr = (int*)malloc(MAX_SIZE * sizeof(int)); 

Wie Potatoswatter The array might be too big for the stack vorgeschlagen ... Sie auf dem Heap zuweisen könnte, als auf dem Stapel ...

More informations .

8

Das Array ist möglicherweise zu groß für den Stack. Versuchen Sie es stattdessen static, also geht es in den globalen Variablenraum. Als zusätzlichen Bonus werden static Variablen auf Null initialisiert. Der Compiler kann im Gegensatz zu anderen Speicherarten prüfen, ob Ressourcen für globale Variablen zur Kompilierungszeit vorhanden sind (und das Betriebssystem kann zur Laufzeit vor dem Programmstart die doppelte Überprüfung durchführen), sodass Sie keine Speicherfehler behandeln müssen. Ein nicht initialisiertes Array wird Ihre ausführbare Datei nicht vergrößern.

Dies ist eine unglückliche grobe Art und Weise der Stapel funktioniert. Es befindet sich in einem Puffer fester Größe, der durch die Konfiguration der Programmdatei entsprechend dem Betriebssystem festgelegt wird, aber seine tatsächliche Größe wird selten mit dem verfügbaren Speicherplatz verglichen.

Willkommen bei Stack Overflow Land!

Verwandte Themen