次の共用体のインスタンスの配列としてデータを格納するマルチスレッドアプリケーションがあります
union unMember {
float fData;
unsigned int uiData;
};
この配列を格納するオブジェクトは、ユニオン内のデータのタイプを認識しているため、正しいタイプを取得するときにUBに問題はありません。ただし、プログラムの他の部分では、これらのユニオンの2つのインスタンス間の同等性をテストする必要があり、コードのこの部分では、実際の内部データ型は不明です。この結果、この種のアプローチを使用して組合の平等をテストすることはできません。
unMember un1;
unMember un2;
if (un1 == un2) {
// do stuff
}
コンパイラエラーが発生します。そういうものとして、私は単に組合のフロート部分を比較することです
if (un1.fData == un2.fData) {
// compiles but is it valid?
}
UBが最後に書き込まれた部分ではないユニオンの任意の部分にアクセスしていることを読んだことを考えると(これは面倒に書かれていますが、これ以上明確な言い方は考えられません)、コードかどうか疑問に思っています上記は私のユニオンインスタンスの同等性をチェックする有効な方法ですか?
これにより、内部的には組合が実際にどのように機能しているかわからないことに気づきました。データは単純にビットパターンとして格納されており、ユニオンにリストされているタイプに応じて、好きなように解釈できると思いました。そうでない場合、ユニオンの2つのインスタンスの同等性をテストするための安全で正しい方法は何ですか?
最後に、私のアプリケーションはC ++で書かれていますが、ユニオンもCの一部であることに気付きました。それで、2つの言語での処理方法に違いはありますか?