(char *) を追加してカーストを入力する理由と、その理由を文字ポインターに追加する理由.
char
は間違った名前です。それは嘘です – それはそれが何であるかだから呼ばれるべきbyte
です: a byte . 使用している関数read
とwrite
関数は、バイト バッファーで動作します。これは、それらを汎用にするためです。つまり、任意の型で動作します (これも嘘ですが)。
アートの前に & シンボルを追加するのはなぜですか?
は&
、オブジェクトのメモリ アドレスを取得します。書き込む(char*) &obj
ことで、特定のオブジェクトの基礎となるバイト バッファ (へのアドレス) を効果的に取得できます。つまり、オブジェクトのバイト単位での表現です。
最後に sizeof(arts) を追加するのはなぜですか?
sizeof(obj)
メモリ内のサイズobj
、つまり、バイト バッファで占めるバイト数を示します。開始アドレス (前のポイントを参照) とサイズが与えられると、メモリ内のオブジェクトの物理的な存在を完全に特徴付けることができ、これを使用してオブジェクトをメイン メモリからファイルに、またはその逆に転送できます。
しかし、前にも言ったように、それは一種の嘘です。C++ には実際には、この種のメモリのコピーをサポートしていない多くのタイプのオブジェクトがあります。これらのオブジェクトは、実際に存在するメモリについて仮定を行うためです。最も単純なケースでは、ポインタ メンバーが含まれています。オブジェクトは、まだ古い場所を指しているため、もはや役に立ちません:
struct some_class {
some_class* self;
some_class() : self(this) { }
};
このクラスには、それ自体を指すメンバー <code>self があります。このクラスのインスタンスをバイトごとにコピーすると、この ID が破棄され、オブジェクトが役に立たなくなります (コピーのself
メンバーをコピーした後も、コピーではなくオリジナルを指します)。
この種のバイト単位のコピーは、前述のポインターを正しくコピーするディープコピーとは対照的に、シャロー コピーとも呼ばれます。
あなたが示したコードは、C++ では一般的に安全ではありません。実際、これにはこれまで言及してきたよりもさらに多くの問題があり、ほとんどの場合、オブジェクトの (非) シリアル化のためのより良い代替手段があります。