2012-04-04 6 views
0
#include<iostream> 
#include <intrin.h> 
using namespace std; 
unsigned __int64 TimeValue=0; 

unsigned __int64 rdtsc(void) 
{ 
    return __rdtsc(); 
}; 

void time_start() { TimeValue=rdtsc(); } 
long long time_stop() { 
    return (rdtsc()-TimeValue); 
} 
int main() 
{ 
    long x[262144],i,k,r; 
    int j; 
    x[0] = 0; 
for (i=1; i<262144; i++) 
{ 
    long r = rand()%i; 
    x[i] = x[r]; 
    x[r] = i; 
} 
    time_start(); 
    for (j=0; j<1000; j++) 
     for (k=0, i=0; i<262144; i++) 
      k = x[k]; 
    cout<<time_stop()/1000/262144; 
} 

In dem Programm muss ich eine Array-Größe von 1 Megabyte erstellen. Beim Debuggen eines Programms in der Zeile long x [262144] tritt ein Fehler auf: Eine nicht behandelte Ausnahme "0x00ff1997" in der "dgdxgdrfy.exe": 0xC00000FD: Stapelüberlauf. Warum ist das und wie kann ich es reparieren?Array der Größe 1 MB

+2

versuchen Sie, Ihr Array als global zu deklarieren. –

Antwort

3

Versuchen Sie, es als globale Variable zu deklarieren - außerhalb der main Methode(). Andernfalls wird es auf dem Stapel zugewiesen, der viel kleiner als der Heap ist. Eine andere Lösung ist die dynamische Zuweisung mit new, die jedoch fehleranfälliger ist.

+1

Wenn Sie 'new' verwenden, verwenden Sie es mit einem intelligenten Zeiger (' std :: unique_ptr' oder 'std :: shared_ptr'). Besser noch, benutze 'std :: vector'. –

+0

Eine globale Variable könnte in diesem speziellen Beispiel funktionieren, aber es ist eine schlechte Angewohnheit, sich darauf einzulassen. –

+0

Danke, bieten eine Reihe von globalen Variablen hat wirklich geholfen. – alexs2011

2

Dies geschieht, weil ein lokales Array auf dem Stapel zugeordnet ist. Sie können dies vermeiden, indem Sie ein dynamisches Array (eines, das mit new erstellt wurde), einen Vektor oder das Array im globalen Gültigkeitsbereich deklarieren.

0

Grundsätzlich sollten Sie das x-Array dynamisch zuweisen, wie in this article zu sehen ist. Das folgende Beispiel wurde aus dem Text herausgezogen. Wenn Sie es ändern, um es für Ihren Fall zu verwenden, sollte es gut funktionieren.

double *num; 
num = (double *) malloc (BUFSZ* sizeof(double)) 
+0

Warum 'malloc' wenn wir' neu' haben? –

+0

@PetarMinchev: Das Beispiel war C-spezifisch, aber jede Form der dynamischen Zuweisung sollte tun ... – PearsonArtPhoto

+0

Ja, fair genug :) –

3

Lokale Variablen werden auf dem Stapel zugewiesen, aber der Stapel ist begrenzt. Sie können das Limit wahrscheinlich mit einem Schalter am Compiler erhöhen.

Das Problem ist das sehr große Array, das Sie deklariert haben. Eine einfache Lösung wird es von ändern auf dem Stapel wird dynamisch zugeordnet werden:

std::vector<long> x(262144); 
0

Sie static long x[262144] verwenden können; Es verschiebt die Zuordnung außerhalb des Stapels und Sie ändern Ihren Code überhaupt nicht.