バイナリデータをファイルに書き込んで、すばやく読み込めるようにする方法は?
質問
データをファイルに書き込み、それを読み戻すことができるファイル形式を書き込む必要があります。
データをかなり高速で読み戻せるはずです。これには、大きなデータブロックをstd::vector
にブリットする必要があります(ストレージは常に連続して実装されるため)。
ただし、ファイルを作成するとき、intおよびその他の型の配置とサイズに制約を適用する方法がわかりません。
これはどのように行う必要がありますか? Q6600(x86)のbuntu linuxでgccを使用しています。
例として:
struct Vertex
{
float point [3];
float normal [3];
float texcoord [2];
}
後で、データはstd::vector<Vertex>
に保存されます。 __attribute__
を使用して、さまざまなプラットフォーム間でより移植性の高いものにするために、それをパッキング/調整することを考えました。
編集: すでに仕様を作成しており、それを使用する予定です。データの最大ビットは頂点とインデックスであるため、これらは大きなブロックとして読み込まれます。たとえば、(より大きな仕様の一部): VertexGroupは、特性を共有する頂点のグループです。一度に1つのマテリアルしか保持できないため、それらの多くがメッシュに含まれている必要があります。
<uint> thisid # Of this VertexGroup
<string> name
<uint> materialId # A material
<uint> vertexCount
for (vetexCount):
<3xfloat> point
<3xfloat> normal
<2xfloat> texcoord
<uint> triangleCount
for (triangleCount):
<3xuint> indices
解決
これは、コンパイラとプラットフォームに依存します。私の知る限り、独自のマクロを多数定義せずに、これを完全にクロスコンパイラおよびクロスプラットフォームで実行する方法はありません。
ただし、VC ++とGCC(大きな2つ)は#pragma pack
ディレクティブをサポートします。これにより、構造体のアライメントとパッキングを定義できます。 http://msdn.microsoft.com/en-us/library/2e70t5y1を参照してください。 .aspx または http://gcc.gnu.org/onlinedocs /gcc/Structure_002dPacking-Pragmas.html 。
そのことを念頭に置いて、fread()
を使用して構造の整列方法を定義し、<=>または同様の方法でファイルからメモリにバイトを単純にblitできます。リスト全体にメモリを一度に割り当てることができるように、リストの先頭にリストのプレフィックスを付けて、1回のI / O呼び出しを使用してファイル全体をロードすることもできます。
他のヒント
POD(プレーンな古いデータ)のみ、ポインターなしの場合、fwriteとfreadのみが可能です。もちろん、同じアーキテクチャで以前とまったく同じ形式を絶対に読み戻すことを前提としています。
ブーストシリアル化を検討してください。