2012-04-04 11 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; 
} 

プログラムでは、1メガバイトの配列サイズを作成する必要があります。 long x [262144]行のプログラムをデバッグすると、エラーが発生します。 "dgdxgdrfy.exe"の未処理の例外 "0x00ff1997":0xC00000FD:スタックオーバーフロー。なぜこれが問題なのですか?サイズの配列1 MB

+2

配列をグローバルとして宣言してみてください。 –

答えて

3

mainメソッド()外のグローバル変数として宣言してください。それ以外の場合は、ヒープよりはるかに小さいスタックに割り当てられます。もう1つの解決策はnewで動的割り当てを使用することですが、これはエラーが発生しやすくなります。

+1

'new'を使うなら、それをスマートポインタ(' std :: unique_ptr'や 'std :: shared_ptr')と共に使ってください。もっと良いのは、 'std :: vector'を使うことです。 –

+0

この特定の例では、グローバル変数が動作する可能性がありますが、悪い習慣です。 –

+0

ありがとう、グローバル変数の配列を提供して本当に助けている。 – alexs2011

2

これは、ローカルアレイがスタックに割り当てられているために発生します。これを回避するには、動的配列(新しいもので作成された配列)、ベクトル、またはグローバルスコープで配列を宣言します。

0

基本的には、this articleのように、x配列を動的に割り当てる必要があります。以下の例はテキストから抜き出したものですが、あなたのケースに合ったものに変更してもうまくいくはずです。

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

なぜ 'malloc'に' new'があるのですか? –

+0

@PetarMinchev:この例はC固有のものですが、ダイナミックアロケーションのどのような形式でも実行する必要があります。 – PearsonArtPhoto

+0

Yep、fair enough :) –

3

ローカル変数はスタックに割り当てられますが、スタックは制限されます。おそらくコンパイラのスイッチを使って制限を上げることができます。

問題は、あなたが宣言した非常に大きな配列です。一つの簡単な修正は、動的に割り当てられていると、スタック上にあるから、それを変更します:

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

あなたはstatic long x[262144]を使用することができます。割り当てをスタック外に移動し、コードをまったく変更しません。