問題タブ [vtable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - メモリ内の仮想テーブルのレイアウト?
仮想テーブルはどのようにメモリに格納されますか? 彼らのレイアウト?
例えば
クラス A とクラス B の仮想テーブルのメモリ内でのレイアウトはどのようになりますか?
c++ - C++ 継承/VTable に関する質問
更新: デストラクタの例を単純なメソッド呼び出しの例に置き換えました。
やあ、
次のコードがある場合:
- B に VTable はありますか? B には仮想関数はありませんが、b::func0() から a::func0() を呼び出します
- func1 は VTable に存在しますか? 仮想ではありません。
- func2 は VTable に存在しますか?
- aa::func0() 呼び出しが b::func0() にない場合、上記の答えは異なりますか?
ありがとう
c++ - C ++の継承メカニズムが不透明なのはなぜですか?
たとえば、vtableを調べるための言語サポートがないのはなぜですか?メンバー関数を新しいものに置き換えられないのはなぜですか?そのような機能を有効に活用する方法があると直感しています。
私がそのようなことをすることを可能にする他の言語はありますか?
c++ - cppunit と xcode プロジェクトの vtable の問題
zxing iphone プロジェクトをビルドし、cppunit-1.12.1 で作成されたテスト スイートを実行しようとしています。プロジェクト内に cppunit-1.12.1 コードをコピーし、アクティブな SDK を 10.5 に変更すると、cppunit および zxingcore ターゲットをビルドできますが、zxingcore-tests ターゲットをビルドしようとすると、次のエラーが発生します。これは vtables に関連しているようで、ライブラリのアーキテクチャ タイプに関係する奇妙な警告が表示されます。
基本的に、すべての行の前に > を挿入することなくフォーマットをエスケープすることにより、これをフォーマットする良い方法はありますか? <pre>
プレビューではうまく機能するタグを使用しましたが、最終的なレンダリングでは機能しませんでした。フォーマットを尊重せず、テキストを切り取っていませんでした。誰かから提案があり次第、フォーマットを変更します。
....many more of these warnings...
そして今、エラー
c++ - 仮想デストラクタと Vtable の間に関係はありますか
仮想関数を作成すると、そのクラスのオブジェクトに vtable が追加されます。仮想デストラクタにも当てはまりますか?デストラクタの仮想性を実装するために使用される vtable
c++ - 仮想ポインタのサイズ - C++
C++の仮想テーブルの仮想ポインタ(VPTR)のサイズは? また、これは宿題の質問ではありません... C ++の本を読んでいるときに頭に浮かんだ質問です。
c++ - クラス(vtables)のC ++別のコンパイラ?
多重継承を許可しない 1 つのコンパイラでクラス A をコンパイルし、それをサポートするクラス B (およびクラス A から派生したクラス B) をコンパイルすると、どのような結果になるのか疑問に思っていました。
リンクの手順がよくわかりません...両方を併用することはできますか?この状況で vtables を使用して別のコンパイラを使用することには、どのような欠点がありますか? クラス B を使用するコードが適切に機能することは不可能でしょうか?
ありがとう。
c++ - シンボル「vtable for ...」および「typeinfo for ...」は未定義ですか?
ほぼ最終ステップですが、まだ奇妙なエラーがいくつかあります....
vtable と typeinfo の意味は何ですか?
c++ - EXE を DLL、ローカル vftable としてロードする
test.exe
通常はスタンドアロン アプリケーションとして使用されるという名前の exe があります。この exe を別のアプリケーション app.exe 内のモジュール (dll) として使用したいと考えています。
test.exe のコードは、次のような非常に単純なことを行います。
どこsomeMethod()
が virtual で、MyClass には virtual d'tor があります。
doTest()
は test.exe からエクスポートされ、test.lib という名前のライブラリが作成され
ます。app.exe はこのライブラリとリンクされ、起動時に test.exe を静的にロードします。
test.exe をスタンドアロンで実行しているときは問題なく動作しますが、app.exe 内からロードして実行しているときはクラッシュします。
デバッガーでコードにステップ インすると、仮想メソッドの呼び出しでクラッシュが発生していることが明らかになりました。vftable がどういうわけか悪くなることがわかりました。
いくつかの調査の後、MyClass のコンストラクター内のコードが実行されている場合、vftable は 1 つのことですが、呼び出しがnew
返されると、「ローカル vftable」と呼ばれる別のものに置き換えられることがわかりました。なぜこれが.
約 1 日デバッグした後、この「ローカル vftable」のポインターは、test.exe がスタンドアロンの場合とモジュールとしてロードされた場合の両方の場合で同じであることがわかりました。test.exe が別のアドレスに読み込まれるため、これは正しくありません...
この理論をテストするために、リンカ オプションの読み込みアドレスを、app.exe にあるときに test.exe が読み込まれるアドレスに変更しました。 、見よ、すべてが機能します。
明らかに、これは恒久的な解決策ではありません。次回、このランダムに選択されたアドレスが占有され、同じ問題が再び発生する可能性があるからです。
私の質問: この「ローカル vftable」が exe の静的読み込みアドレスに関連付けられているのはなぜですか? exeをモジュールとしてロードするのは悪いことですか? exe が静的アドレスにロードされていると想定するのはなぜですか?
参考までに、これはすべて MSVC 2008、Windows XP x64 で行われます。