2016年01月20日

Visual C++ 2010のfwriteの限界?

先日、お仕事で、後輩の作っているプログラムを見る機会があったのですが、そこで、ちょっと不思議な挙動を見たのでメモ。

Visual C++ 2010で、fwrite() 関数に対して500MB近いバッファを与えて、一気に書き込みをしようとしていたのですが、fwrite() 関数が戻り値0でエラーリターンしていました。errnoを調べると、「Invalid argument」(不正な引数)を示していました。

試しに、次のどちらかを試すと、問題は解消しました。

  • fwrite()に与えるバッファサイズ・書き込みサイズを200MB近くまで下げる。
  • fopen()するときに、modeとして "wb" ではなく "wb+" を与える。

おそらく、Visual C++ 2010 の fwrite() 関数の実装か、その実装で使われている Windows API (WriteFile() APIか何か?) の制限があるのでしょう。一度に書き込める限界があったのかも知れません。

fopen() するときのmodeに"+"を付けると問題が解決する理由もよく分かりませんが、"+"は読み書き兼用のファイルを開くことを意味しており、読み書きのために多くのバッファを確保できる仕組みがあるのかも知れません。

ネット上で検索しても、それっぽい情報が出てこなかったので、ちょっと不思議に思いまして。

あるいは、ハードウェア的に、いわゆる DMA 的なやつが連続して扱えるメモリ量に限界があるとか?そういったものもあるんでしょうか。そこら辺はよく分からないですけどね。

posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | C/C++