一時的にFIFループ(関数ループ)と呼ばれるループのアイデアが出たとき、私は多くの異なる愚かなループで遊んでいました。C - 複数の再帰的な書き込みを1つのポインタに書き込んだ後のメモリアクセスエラー
正確には174665回繰り返されるまでは正常に機能します(通常のループよりも10倍遅くなりますが、現在はnvmです)。 174665回目の繰り返しでは、が* kポインタの行につきます。 void fif(bool (*f)(int *x),int i,int *k){
です。同じ点で常にクラッシュします(同じ繰り返し)。なぜどんなアイデア? Ubuntu 15.10、gcc version 5.2.1 20151010でテストしています。私はCで新しくなっていますので、newbiに気をつけてください:)。あなたがcall stackを吹き消すためです
#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);
}
}
まあ、それは再帰的に興味深いものです。あなたはあなたのスタックbtwをあふれている。 – EOF
大学の講師の一人は「IF LOOP」のようなものはないと言っています。私はちょっと、似たようなパフォーマンスを持っているifとgotoを使ってちょっと作ったことがあります(正直言ってコンパイラが同じようにコンパイルすると思います)。しかし、もう一歩進んでみたいと思っています:D – Luke
あなたはおそらくあまりにも深く再帰し、あなたのスタックスペースを吹き飛ばした(すべて8 MiB)。 –