任意のデータをシリアル化し、メタデータとして特殊な画像形式に保存するために使用する C++ コードを入手しました。
とにかく、それはボイド*と見なされます。簡単な memcpy を実行できますか? または、これを行うより良い方法はありますか?
STL文字列は、メモリの連続ブロックにデータを格納しない場合があります。c_str()メソッドを使用して、cスタイルの文字列を取得し、シリアル化します。ベクターはデータを継続的に保存するため、直接シリアル化できます。
std :: stringの場合、c_str()を使用して、内部文字列を指すchar*を取得できます。
std :: vectorの場合、標準では要素がメモリ内で隣接しているため、&v[0]としてデータの先頭へのポインタにアクセスできます。
もちろん、オブジェクトの内部データへのポインタを使用しているライブラリを基本的に渡すため、これらには注意する必要があります。必要に応じて、上記をsrcポインタとして使用してmemcpyを使用してデータのコピーを作成できますが、明らかに正しいサイズを使用するように注意する必要があります。このデータを渡す関数の詳細を知らなければ、そのようなコピーが必要かどうかについてコメントすることはできません。
他の人が指摘したように、 &v[0] はベクトル内の配列へのポインターを提供します。
ただし、memcpy を使用したデータのシリアライズは、一般に C++ ではまったく移植できないことに注意してください。データは Plain-Old-Data 型である必要があります (つまり、自明でないコンストラクタ、仮想関数、ユーザー定義のデストラクタなどは使用できません)。ただし、まったく同じデータに読み戻さない限り、正しい動作が得られるとは期待できません。プログラム。
ターゲット プラットフォーム、コンパイラ、またはコンパイラの設定を変更すると、データの形式が変わる可能性があります。コンパイラは、たとえば、許可されており、通常は構造体にパディング フィールドを追加します。
必要に応じて、Boost Serializationなどの複雑なデータをシリアル化できる優れたライブラリがあります。std::vector およびその他の標準型のサポートが既に組み込まれています。
STL Vectorは、その要素を連続したメモリに格納するため、memcopyを使用して、要素のサイズと数を知っている要素をコピーできます。