2012-01-31 36 views
1

私は現在MS Visual C++ 6.0の既存のコードを読んでいます。私はオブジェクトを構造体にキャストするコードパターンに気付きました。MSVC++クラス構造体にキャスト

CMemoryオブジェクトがあります。

CMemory a; 
MY_STRUCTURE_A* a = (MY_STRUCTURE_A*)(void *)a; 
MY_STRUCTURE_B* a = (MY_STRUCTURE_B*)(void *)a; 

私はカスタムメモリクラスをチェックしました。これは本当にクラスオブジェクトです。それはa =演算子が定義されていますが、構造体に再解釈することはできません。なぜこれが行われているのですか?オブジェクトタイプはどのようにして異なるオブジェクトにキャストされますか?

なぜこれが行われているのですか?私はreinterpret_castがあることを知っていますし、構造ポインタへのvoidポインタへのキャストのこの技法は似ていると推測しています。しかし、私はそれが同じかどうかは分かりません。このパターンはクラスオブジェクトを構造体にキャストするのに安全ですか?

注:CMemoryは、使用されるオブジェクトの頭文字の名前です。これはMFCクラスの一部ではありません。

Necrolisのコメントに基づいて追加されました。 CMemoryには、(1)charポインタ、(2)intの割り当てられたメモリを指定するint、および(3)CMemoryの他のインスタンスへの前後のポインタで宣言された3つのメンバしかありません。メンバメソッドもたくさんあります。私が理解していることから、たとえクラスを直接構造にキャストしたとしても。クラスはcharポインタである最初のメンバ変数で始まるはずです。

クラスの名前と鋳造で行く
class CMemory { 
public: 
    CAMemory(); 
    ... Other methods 
private: 
    char *m_pMemory; 
    int m_memorySize; 
    ... Other field 
} 

答えて

1

CMemoryの可能性が高い(GCのため、任意のハッシュテーブルなど)、一般的なメモリ・ブロック・タグよりもであり、そのタグ付けは、キャストを必要とするメモリにアクセスします。もちろん、これは「最良の推測」です。CMemoryの完全なコードを見ることなく何も意味しません。

UBだけでなく、少なくともあなたの例では、キャストするオブジェクトがメモリレイアウトによって表されるオブジェクトであるかどうかはチェックされていません。また、これはC++であるので、Cキャストを避ける必要があります(二重キャストは実際にはコンパイラのエラー/警告を回避することですが、これは常に最悪の解決方法です)。

+0

コメントに基づいてCMemoryに詳細を追加しました。しかし、CMemoryがクラスヘッダーの最初のメンバフィールドまたはクラスヘッダー上のポインタ(おそらく4バイト)を指している場合、私は考えています。私はそれがメモリブロックである最初のメンバ変数を指していると思う。 – Nap

関連する問題