T
がポインタを含まないPODタイプで、T(ほかのデータに加えて)をシリアル化したいとします。私はこれを行うには、以下の関数を作成しました:char配列に直接キャストしてPODデータをシリアル化するのは安全ですか?
template<class T> void serialize(const T& source, char*& dest)
{
*(T*)dest = source;
dest += sizeof(T);
}
template<class T> void deserialize(T& dest, char*& source)
{
dest = *(T*)source;
source += sizeof(T);
}
これは、任意の問題を引き起こすか、これは動作しません任意のコンパイラはありますでしょうか?つまり、コードになります。
template<class T> bool check_sanity(const T& obj)
{
std::unique_ptr<char[]> buffer { new int[sizeof(T)] };
serialize(obj, buffer);
T new_obj;
deserialize(new_obj, buffer);
return new_obj == obj;
}
はエヴァーfalseを返しますか? (TはPODであり、誰も==演算子をオーバーロードしていないと仮定します)。
私はこれらのシリアル化メソッドをMPIと共に使用しています。これらのメソッドは、プログラムの開始時に簿記に必要なデータの一部を配布するために使用されるため、同じプログラムは常にシリアル化およびデシリアライズされますデータ。
「T *」から「char *」へ、そして「T *」から「T *」に戻って、厳密なエイリアスの規則を破っているかどうかはわかりませんが、私は 'reinterpret_cast' – Brandon