1. ホーム
  2. c

freadの実際の効果はどうですか?

2023-07-19 05:31:36

質問

の宣言は fread は以下のようになります。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

の2つの呼び出しの読み込み性能に違いがあるかということです。 fread :

char a[1000];

  1. fread(a, 1, 1000, stdin);
  2. fread(a, 1000, 1, stdin);

読み方は 1000 バイト すぐに となります。

どのように解決するのですか?

性能に差がある場合とない場合があります。 セマンティクスに違いがあります。

fread(a, 1, 1000, stdin);

は、それぞれ1バイトの長さの1000個のデータ要素を読み込もうとします。

fread(a, 1000, 1, stdin);

は1000バイト長の1つのデータ要素を読み込もうとします。

両者が異なるのは fread() は、バイト数ではなく、読み取ることができたデータ要素の数を返すからです。 1000 バイトを完全に読み込む前にファイルの終わり (またはエラー条件) に達した場合、最初のバージョンでは読み込んだバイト数を正確に示さなければなりませんが、2 番目のバージョンでは単に失敗して 0 を返します。

実際には、おそらく 1000 バイトを読み込もうとする低レベルの関数を呼び出し、実際に何バイト読み込んだかを示すだけでしょう。 より大きな読み取りを行う場合、複数の低レベルの呼び出しを行うかもしれません。によって返される値の計算は fread() が返す値の計算は異なりますが、その計算の費用は些細なものです。

データを読み込もうとする前に、読み込むのに十分なデータがないことを実装が判断できる場合は、違いがあるかもしれません。 たとえば、900 バイトのファイルから読み込む場合、最初のバージョンでは 900 バイトすべてを読み込んで 900 を返しますが、2 番目のバージョンではわざわざ何も読み込まないかもしれません。 どちらの場合も、ファイル位置のインジケータは 文字 すなわち 900 バイトです。

しかし一般的には、そこからどのような情報を必要とするかによって呼び方を選ぶべきでしょう。 部分的な読み取りがまったく何も読み取らないのと変わらない場合は、単一のデータ要素を読み取ります。 部分的な読み取りが有用である場合は、より小さなチャンクで読み取ります。