2012-05-17 22 views
34

各タイプが保持できる値のサイズ以外に、の使用方法はで、size_toff_tの間の主な違いは何ですか?絶対サイズにはsize_tタイプが使用されており、オフセットにはoff_tタイプが使用されていますか?それともそれより深く行くのですか?size_tとoff_tの使用法の違いは何ですか?

大きなファイルの書き込みをmmapで可能にするためにラッパークラスを作成しています。それらの引数に使用する最適なタイプを知りたいと思います。私が4GBを超えるファイルに書きたいと思えば、私はsize_tをすべて使いたいと思っていますが、それがベストプラクティスですか? (または私は特定の機能のために、いくつかのoff64_tタイプを使用する必要があります?)

たとえばとして、私のwriteAt機能を宣言する必要があります。

MMapWriter::writeAt(off64_t offset, const void* src, size_t size) 

または

MMapWriter::writeAt(size_t offset, const void* src, size_t size) 

答えて

44

size_tは、オブジェクトに対してoff_tですファイル用です。

mmapは、2つの概念をほとんどの定義でマージします。個人的に私はsize_tを使用したいと思います。何があっても、マップされたファイルは(仮想)メモリ内の配列でもあるからです。 、

size_t

off_tではPosixで、標準C++で、 off64_t私はそれは常に64ビットGNUシステム上で off_tと同じタイプであるべきだと思います などの機能fopen64ftello64、と行くGNUの拡張であるが、チェックせずにあなたの会社を賭けてはいけません。

off_tが、は署名されていません。しかし、size_tの署名された対応者はptrdiff_tです。したがって、署名付きのタイプが必要な場合は、off_tまたはoff64_tを使用する必要はありません。

+0

スティーブさんありがとう、これは大きな助けになります。私は 'mmap'が2つの概念を橋渡ししているというリンクを作っていないと思います。 –

+0

偉大な答えが、なぜ地獄でfread()とfwrite()は 'size_t'を取るのですか? –

+4

また、size_tの署名された対応するものとしてssize_tがあることに注意してください。 – fuz

12

size_tは、C++(およびC)標準の一部であり、sizeof表現のタイプを参照しています。 off_tは、Posix標準で定義されており、ファイルのサイズを参照します。

+0

'off_t'は移植性がありませんか?あるいは、C/C++標準自体がposix標準に準拠していますか? –

+3

@Als:Posixライブラリは、C(およびC++)標準の拡張セットです。それらが追加するものの中には、 'lseek'のように' off_t'とそれを使用するファイル関数があります。 C/C++はPosixに準拠していません。とにかくPOSIXは、プログラミング言語ではなく、オペレーティングシステムの仕様です:例えば、C言語標準の範囲を超えているシェルやシェルユーティリティを含むライブラリ(Posixは、 'system'の定義は去ります)。 –

+3

そして 'off_t'を使うことは、' mmap'を使っている場合は "ポータブル"で、Posix関数もあります。ポータブルなPosixコードです。ポータブルなC++コードではありません。 –

関連する問題