2013-06-16 28 views
5

Önbelleğe almanın programlı olarak aşağıdaki programı kullanarak etkilerini anlamaya çalışıyorum. Kodla segfault alıyorum. Ben (-g -O0 ile derlenmiş) GDB kullanılan veArama çağrısı sırasında bölüm hatası()

start = clock() (first occourance) 

ben yanlış mı yapıyorum üzerinde segmentasyon faylanma olduğu bulundu? Kod bana iyi görünüyor. Birisi hataya işaret edebilir mi?

#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; 
} 

cevap

4

deneyin değiştirmek için:

int arr[MAX_SIZE]; 

için:

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

Potatoswatter The array might be too big for the stack önerildiği gibi ... Sen yığın daha öbek üzerinde tahsis gidebilir ...

More informations .

8

Dizi, yığın için çok büyük olabilir. Bunun yerine static yapmayı deneyin, bu yüzden global değişken boşluğa gider. Ek bir bonus olarak, static değişkenleri sıfır değerine sıfırlanır.

Diğer depolama türlerinden farklı olarak, derleyici, derleme zamanında globals için kaynakların varlığını kontrol edebilir (ve işletim başlamadan önce işletim sisteminin çalışma zamanını iki kez kontrol edebilir), böylece bellek hatalarını çözmeniz gerekmez. Başlatılmamış bir dizi, yürütülebilir dosyanızı daha büyük hale getirmez.

Bu, yığının çalışma şeklinin talihsiz bir kaba kenarıdır. Program çalıştırıcısının işletim sistemine göre yapılandırmasıyla belirlenen sabit boyutlu bir tamponda yaşıyor, ancak gerçek boyutu mevcut alana göre nadiren kontrol ediliyor.

Taşma Yığınına Hoş Geldiniz!

İlgili konular