1

任意のデータをシリアル化し、メタデータとして特殊な画像形式に保存するために使用する C++ コードを入手しました。

とにかく、それはボイド*と見なされます。簡単な memcpy を実行できますか? または、これを行うより良い方法はありますか?

4

4 に答える 4

5

STL文字列は、メモリの連続ブロックにデータを格納しない場合があります。c_str()メソッドを使用して、cスタイルの文字列を取得し、シリアル化します。ベクターはデータを継続的に保存するため、直接シリアル化できます。

于 2009-12-05T06:42:16.937 に答える
4

std :: stringの場合、c_str()を使用して、内部文字列を指すchar*を取得できます。

std :: vectorの場合、標準では要素がメモリ内で隣接しているため、&v[0]としてデータの先頭へのポインタにアクセスできます。

もちろん、オブジェクトの内部データへのポインタを使用しているライブラリを基本的に渡すため、これらには注意する必要があります。必要に応じて、上記をsrcポインタとして使用してmemcpyを使用してデータのコピーを作成できますが、明らかに正しいサイズを使用するように注意する必要があります。このデータを渡す関数の詳細を知らなければ、そのようなコピーが必要かどうかについてコメントすることはできません。

于 2009-12-05T06:46:00.727 に答える
2

他の人が指摘したように、 &v[0] はベクトル内の配列へのポインターを提供します。

ただし、me​​mcpy を使用したデータのシリアライズは、一般に C++ ではまったく移植できないことに注意してください。データは Plain-Old-Data 型である必要があります (つまり、自明でないコンストラクタ、仮想関数、ユーザー定義のデストラクタなどは使用できません)。ただし、まったく同じデータに読み戻さない限り、正しい動作が得られるとは期待できません。プログラム。

ターゲット プラットフォーム、コンパイラ、またはコンパイラの設定を変更すると、データの形式が変わる可能性があります。コンパイラは、たとえば、許可されており、通常は構造体にパディング フィールドを追加します。

必要に応じて、Boost Serializationなどの複雑なデータをシリアル化できる優れたライブラリがあります。std::vector およびその他の標準型のサポートが既に組み込まれています。

于 2009-12-05T11:59:08.770 に答える
0

STL Vectorは、その要素を連続したメモリに格納するため、memcopyを使用して、要素のサイズと数を知っている要素をコピーできます。

于 2009-12-05T06:46:18.753 に答える