9

C++ で静的にリンクされた C++ ライブラリが複数ある場合、それらが有効/無効なランタイム タイプ情報 (RTTI) の異なる値でコンパイルされている場合、クラス オブジェクトを共有 (関数との間で受け渡し) することは可能ですか?

--編集: 回答ありがとうございます。私が心配していた具体的なことは 1 でした。RTTI を有効にすると、静的 (非ポリモーフィック型) の sizeof の動作が変わりますか?

2. RTTI 対応ライブラリでクラスを作成し、それを別の非 RTTI 対応ライブラリに渡すと、仮想メソッドは正しく機能しますか。(およびその逆)

最後に 3. RTTI 対応ライブラリでクラスを作成する場合、そのオブジェクトを非 RTTI 対応ライブラリに渡すと、そのオブジェクトで引き続き使用できます? ...私はそうではないと思います.とにかくそれは悪い考えのようです...私はただ興味があります.

4

3 に答える 3

7

RTTI 情報の保存方法は実装の詳細であるため、異なるコンパイラ間で移植することはできません。

また、ほとんどのコンパイラは、異なるフラグでコンパイルされたオブジェクトがメソッドに同じ ABI を使用することさえ保証していません。これは、リリース ライブラリとデバッグ ライブラリで最も顕著に示されますが、他のフラグによっても違いが生じる可能性があります。

関数/メソッドの ABI が変更される可能性があるだけでなく、フラグは構造内の要素間でコンパイラによって使用されるパディングに影響を与える可能性があるため、仮想メソッドを持たないオブジェクトでも、異なるフラグでコンパイルすると互換性がなくなる可能性があります。

ほとんどの IDS を使用すると、その効果を確認できます。デバッグ/リリース バイナリは個別のディレクトリにビルドされ、同じ種類のバイナリに対してのみリンクされます (フラグの違いにより非互換性が生じる可能性があるため、ユーザー定義のビルドも個別の一意のディレクトリにビルドされます)。ビルドで特定のフラグを変更すると、通常、プロジェクト全体が強制的に再ビルドされます。

于 2009-09-29T10:46:32.640 に答える
1

それはあなたが話している特定のC++コンパイラに依存します-私はC++での最近のクロスプラットフォームの経験はありません(最近の私のC++の仕事はLinux上のC++だけでした)が、数年前に私はgcc を使用すれば、Visual C++ では「あり得ない」、他のコンパイラではその中間にあるなど、かなりの誤解を免れることができただろうに違いありません...!-)

于 2009-09-29T04:49:31.123 に答える
-1

共有されるクラスがポリモーフィックでない(つまり、仮想関数を含まない) 限り、これは問題になりません。ただし、RTTI を無効にすると、dynamic_cast、typeid、および例外を使用できなくなります。

于 2009-09-29T04:51:01.930 に答える