1

私が一時的に FIF ループ (関数ループ) と呼んだループのアイデアにたどり着いたとき、私は多くの異なる形式のループをいじっていました。

正確に174665回の繰り返しを行うまで、かなりうまく機能します(通常のループよりも10倍遅いですが、今のところnvmです)。174665回目の繰り返しでCannot access memory at address、行の *k ポインターにスローされます: void fif(bool (*f)(int *x),int i,int *k){。常に同じポイントでクラッシュします (同じ繰り返し)。理由はありますか?Ubuntu 15.10、gcc バージョン 5.2.1 20151010 でテストしています。助けてくれてありがとう

私のコード:

#include <stdio.h>
#include <stdbool.h>

#define REPEATS 1.8E5

#ifdef WIN32

#include <windows.h>
double get_time()
{
    LARGE_INTEGER t, f;
    QueryPerformanceCounter(&t);
    QueryPerformanceFrequency(&f);
    return (double)t.QuadPart/(double)f.QuadPart;
}

#else

#include <sys/time.h>
#include <sys/resource.h>

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

#endif

bool fifFunction(int *k);
void fif(bool (*f)(int *x),int i,int *k);

int main()
{
        //FIF

        printf("FIF loop\n");
        double t = get_time();
        int k = 0;
        fif(fifFunction,REPEATS,&k);
        printf("time: %f\n",get_time() - t);    
    return 0;
}

bool fifFunction(int *k)
{
        return (*k = *k + 1);
}


void fif(bool (*f)(int *x),int i,int *k){
    if (i > 0){
        if ((*f)((k)) == false){
            return;
        }
        fif(f,(i-1),k);
    }
}
4

1 に答える 1

4

それは、コール スタックを吹き飛ばすためです。

void fif(bool (*f)(int *x),int i,int *k){
    if (i > 0){
        if ((*f)((k)) == false){
            return;
        }
        fif(f,(i-1),k); // HERE
    }
}

とマークされた行で、変数、、およびを再帰的にスタックにHEREプッシュします。十分な回数の後、スペースが不足し、プログラムがクラッシュします。でコンパイルすると、末尾再帰呼び出しであるため、gcc はこれを反復に変換しますが、この動作に頼るべきではありません。代わりにこれをループで記述する必要があります。xik-O3

于 2016-04-14T19:54:23.060 に答える