1

ループで malloc を使用しないことで、パフォーマンスを改善しようとしています。配列のサイズはほとんど常に同じサイズであるため、スタック変数を使用しようとしており、配列が大きすぎる場合にのみ置き換えます。残念ながら、それは私が得ている動作ではないようです。これが私のコードスニピットです。ここで明らかに間違っていることはありますか。

    double *A
    if(n>1024){
        A = malloc( n * sizeof( *A ) );
        if( !A ) {
               fprintf( stderr, "Failed to allocate phi in calculate_forces()\n" );
               exit( EXIT_FAILURE );
        }
    }
    else{
        double a[1024];
        A=a;
    }
4

2 に答える 2

3

中かっこが 1 つ不足しているため、実装されているロジックが変更されます

double *A
if(n>1024){
    A = malloc( ng * sizeof( *phi ) );
    if( !phi ) {
           fprintf( stderr, "Failed to allocate phi in calculate_forces()\n" );
           exit( EXIT_FAILURE );
    }
}                 // this is the brace you need to add <<<<<<<<<<<<<<<<<
else{
    double a[1024];
    A=a;
}

編集:

あなたのコードには他にも問題があります.aへの割り当てA,aよりも短い寿命,Aを呼び出す必要があるかどうかを判断できない, それらの 1 つだけの代わりにandfreeを使用する - おそらくバグであり, おそらく と を混同する.nngphiA

于 2013-05-14T19:36:34.097 に答える
0

Visual C++ を使用している場合は_malloca/_freea、関数のペアを使用して、しきい値 (たまたまあなたのもの - 1K) に基づいて、スタックとヒープの割り当てを自動的に切り替えることができます。別のコンパイラを使用している場合は、これらと同等のものを独自に作成できます。

于 2013-05-14T20:53:15.487 に答える