2016-04-11 7 views
1

すべての非静的メンバーがPODであるようなクラスXと、同じメンバーがXと同じクラスであり、PODであるクラスY自体。 reinterpret_castのインスタンスはYXの正当なものですか?そうでない場合は、プラットフォーム間で実際に動作しますか?同じメンバーを共有する2つのC++クラスのメモリレイアウト

あなたの背景のビットを与えるために、私のクラスXは、利便性(すなわちclass X { ... public: static const X& a; static const X& b; }のための静的メンバとしての地位を持っている、と私はAPIを変更せずに、静的初期化子を削除したい。私の計画はYタイプのグローバルな静的オブジェクトを作成することでしたし、 Xからreinterpret_castそれらを - 。すべてのメンバーがPODであるため、私が実行されるように、コンストラクタを必要としないメンバーのレイアウトを想定し

+0

なぜ基本クラスがないのですか?人生の謎を救う –

+2

'reinterpret_cast'は実際にはうまくいくでしょう。 2つを共用体にすると、(この場合は)すべてのフィールドであるフィールドの「共通初期シーケンス」を明示的に参照することができます。 –

+0

@EdHeal "APIを変更しない" –

答えて

1

はまったく同じであり、あなたは、あなたが「安全」reinterpret_castすることができます任意の継承を導入していません。私は理由のために引用符で "安全に"置く、これは単に悪い考えであると思われる、あなたはあなたがしたいと言うあなたは

... APIを変更せずに静的イニシャライザを削除します。私の計画は、グローバルな静的オブジェクトを作成することでした...

どうしますか?クラス内に静的変数のセットを保持することには欠点が1つしかありません。使用するたびにクラスの名前を入力する必要があります。 グローバル変数にstaticキーワードを追加しても、クラス宣言と同じ動作をしません。staticグローバル変数に追加すると、コンパイラは変換単位の範囲内でのみその変数を使用します。つまり、別々のファイルに同じ名前の複数のグローバルがある可能性があります。繰り返しますが、これは複雑さを増すだけですが、これを正確に行う理由を指定していないにもかかわらず、私はあなたが達成しようとしているものがはるかにスコープ指向の方法で解決されるべきであると言うことができます。

+0

静的な初期化子はmain()へのホットパスにあり、並列化されておらず、初期化の順序に関連した見つけにくいバグにつながります。私が取り組んでいるプロジェクトには厳しい方針があります。 – xyzzyz

関連する問題