コードの再帰的な性質を維持しながら、この関数をスレッドセーフにするにはどうすればよいですか?
int foo(char *p)
{
static int i = 0;
if (*p == '\0') return i;
i++;
return foo(p+1);
}
#include <iostream>
using namespace std;
int foo(char* p, int start)
{
if (*p == 0) return start;
return foo(p+1, start+1);
}
int main()
{
char test[] = "HI THERE";
cout << foo(test, 0);
return 0;
}
C ++ 11では、次を使用できますthread_local
。
int foo(char *p)
{
thread_local int i = 0;
if (*p == '\0') return i;
i++;
return foo(p+1);
}
i=0
この関数は、 (あなたの例では)1回だけ実行され、私の例ではスレッドごとに1回だけ実行される、単なる例であることを願っています。
古いコンパイラstatic __thread
は、C++11より前の代替としてサポートする場合があります。
int foo(char *p, int i = 0)
{
if(*p == '\0')
return i;
return foo(p+1, i+1);
}
再帰は素晴らしいものですが、スタックフレームが作成されている場合は、ループよりも効率が低下する可能性があります。これは、スタックオーバーフローを引き起こす最も簡単な方法です。私はそれを取り除くことをお勧めします。以下はより単純で、おそらくより高速です。
int foo(char *p)
{
return strlen(p);
}
または、さらに良いのは、直接電話strlen
してを取り除くことですfoo
。
これはかなり危険であることに注意してください。'\0'
が来ない場合はどうなりますか?誰が何を知っているかを読んでください...