42

各タイプが保持できる値のサイズ以外に、との使用の主な違いは何ですか?タイプは絶対サイズに使用され、タイプはオフセットに使用されるのは単なる慣例ですか?それともそれよりも深くなりますか?size_toff_tsize_toff_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)
4

3 に答える 3

59

size_tオブジェクトoff_t用、ファイル用です。

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

size_tは標準のC++でoff_tあり、Posixであり、関数などをoff64_t伴うGNU拡張機能です。64ビットGNUシステムと同じタイプである必要があると思いますが、チェックせずに会社に賭けないでください。fopen64ftello64off_t

関連性がある場合は、off_t署名されていますが、署名されてsize_tいません。ただし、の署名された対応物size_tptrdiff_tであるため、署名されたタイプが必要な場合でも、off_tまたはを使用する必要があることを自動的に意味するわけではありませんoff64_t

于 2012-05-17T11:21:05.863 に答える
13

size_tはC++(およびC)標準の一部であり、式のタイプを指しsizeofます。 off_tPosix標準で定義されており、ファイルのサイズを指します。

于 2012-05-17T11:21:53.130 に答える
0

このシナリオの経験則。cスタイルであれc++スタイルであれ、明示的なキャストの使用量が最小になる関数シグネチャを使用してください。キャストする必要がある場合は、キャストの種類が制限されているため、C++スタイルの方が安全です。

これの利点は、タイプが一致しないプラットフォームに移植する場合(署名、サイズ、エンディアンの問題など)、実行時ではなくコンパイル時にほとんどのバグをキャッチする必要があることです。キャスティングは、三角形のオブジェクトを丸い穴に押し込むための大ハンマーのアプローチです(多かれ少なかれ、コンパイラに静かに保つように指示します、私は何をしているのか知っています)。

実行時にキャストの問題を見つけようとすると、再現が困難になる可能性があるため、苦痛になる可能性があります。実行時よりもコンパイル時に問題を見つける方が良いです。コンパイラはあなたの友達です。

于 2018-04-17T12:10:25.077 に答える