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:スタックオーバーフロー。これはなぜですか、そしてそれを修正する方法は?

4

5 に答える 5

3

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

于 2012-04-04T14:19:13.710 に答える
3

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

問題は、宣言した非常に大きな配列です。1 つの簡単な修正で、スタック上から動的に割り当てられるように変更できます。

std::vector<long> x(262144);
于 2012-04-04T14:26:08.637 に答える
2

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

于 2012-04-04T14:19:20.060 に答える
0

基本的に、この記事で見られるように、x 配列を動的に割り当てる必要があります。以下の例は本文から抜粋したものです。自分のケースに合わせて変更すれば、問題なく動作するはずです。

double *num; 
num = (double *) malloc (BUFSZ* sizeof(double))
于 2012-04-04T14:20:20.837 に答える
0

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

于 2012-04-04T14:57:56.797 に答える