0

getcwd() に関するGNU Lib Cのドキュメントによると...

この関数の GNU C ライブラリ バージョンでは、バッファ引数にヌル ポインタを指定することもできます。次に getcwd は、malloc と同様に自動的にバッファーを割り当てます (Unconstrained Allocation を参照)。サイズが 0 より大きい場合、バッファはその大きさです。それ以外の場合、バッファは結果を保持するのに必要なだけ大きくなります。

ここで、GNU ドキュメントで説明されている標準の getcwd() を使用した実装に注目してください。

char* gnu_getcwd ()
{
   size_t size = 100;
   while (1)
   {
      char *buffer = (char *) xmalloc (size);
      if (getcwd (buffer, size) == buffer)
        return buffer;
      free (buffer);
      if (errno != ERANGE)
        return 0;
      size *= 2;
   }
}

これは、移植性と安定性に優れているように見えますが、メモリの割り当てと解放のすべてが面倒な妥協のようにも見えます。関数が頻繁に呼び出される可能性があることを考えると、これはパフォーマンス上の問題になる可能性がありますか?

*「プロファイリングする」と言うのは簡単ですが、これは考えられるすべてのシステムを説明することはできません。現在または将来。

4

3 に答える 3

3

初期サイズは 100 で、通常のシステムに存在するほとんどのパスよりも長い 99 文字のパスを保持します。これは一般に、「メモリの割り当てと解放」がなく、無駄になるのは 98 バイト以下であることを意味します。

各試行で 2 倍になるヒューリスティックは、最大で対数の数のスプリアス割り当てが行われることを意味します。多くのシステムでは、パスの最大長は別の方法で制限されています。つまり、発生する再割り当ての数には有限の制限があります。

getcwdこれは、 をブラック ボックスとして使用する限り、実行できる最善の方法です。

于 2014-07-25T13:37:12.053 に答える