問題タブ [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.

0 投票する
12 に答える
62956 参照

c++ - 仮想関数と vtable はどのように実装されていますか?

C++ の仮想関数については誰もが知っていますが、深いレベルではどのように実装されているのでしょうか?

実行時に vtable を変更したり、直接アクセスしたりできますか?

vtable はすべてのクラスに存在しますか、それとも少なくとも 1 つの仮想関数を持つクラスにのみ存在しますか?

抽象クラスは、少なくとも 1 つのエントリの関数ポインタに対して単に NULL を持っていますか?

単一の仮想関数を使用すると、クラス全体が遅くなりますか? それとも、仮想の関数への呼び出しのみですか? また、仮想関数が実際に上書きされているかどうかにかかわらず、速度は影響を受けますか、それとも仮想である限り効果はありませんか。

0 投票する
6 に答える
2086 参照

c++ - QAbstractTableModel 継承 vtable 問題

ここに qt の別の問題があります: QAbstractTableModel を拡張しましたが、コンパイル エラーが発生しました (私は cmake を使用しています)。

コンパイルすると、次のようになります。

TableModel の関数TableModel': /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: undefined reference tovtable ' /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: への未定義参照vtable for TableModel' collect2: ld returned 1 exit status

誰かが同じ問題を抱えていますか??

0 投票する
6 に答える
31453 参照

c# - 仮想関数は C# と Java でどのように機能しますか?

仮想関数は C# と Java でどのように機能しますか?

C++ と同じ vtable と vpointer の概念を使用していますか、それともまったく異なるものですか?

0 投票する
9 に答える
12856 参照

c++ - 仮想クラスのすべてのオブジェクトは vtable へのポインタを持っていますか?

仮想クラスのすべてのオブジェクトは vtable へのポインタを持っていますか?

それとも、仮想関数を持つ基本クラスのオブジェクトだけがそれを持っていますか?

vtable はどこに保存されましたか? プロセスのコードセクションまたはデータセクション?

0 投票する
6 に答える
1132 参照

c++ - VS2005 C++ 壊れた vtable

私は現在、非常に大きな (そして古いため息をつく) コード ベースに取り組んでおり、最近 VS2005 (SP1) にアップグレードされました。私と私のチームは、このコードのモジュールを変更/更新/置換していますが、vtables が壊れているように見える問題に時々遭遇しています。私は vtables の専門家ではありませんが、これらは確かに壊れているようです。エラーは、次のエラーで明らかになります。

実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。

もちろん、このエラーには他にも多くの理由が考えられますが、デバッグ (デバッグ ビルド) 時に、操作したいオブジェクトの vtables が奇妙に見えることを実際に確認できます。

各 vtable を参照するスタックとヒープは正常に見え、vtable へのポインターはマップ ファイルと完全に一致します。これは、vtables が格納されている場所ではなく、スタックとヒープに影響するため、これがメモリ上書きバグなどではないことを示しています。(読み取り専用領域に保存されていますよね?) とにかく、今のところ問題ないようです。しかし、vtable のメモリを見ると、すべての値をポインターとして解釈すると、同じ範囲 (例: 0x00f203db 0x00f0f9be 0x00ecdda7 0x00f171e1) にあるにもかかわらず、マップ ファイルのどのエントリとも一致せず、それらの多くが一致することがわかります。 4 バイトにアラインされていません。VS2005 がどのように vtable を構築するかについての詳細はわかりませんが、これは私には間違っているように見えます。これが正しい動作である場合、おそらく誰かが私にこれを説明できますか?

私の質問は、この動作の原因は何ですか? たとえば、クラス階層が複雑すぎる場合、リンカに既知のバグはありますか? 誰かが以前に似たようなものを見たことがありますか? 現在、関数を影響を受けるクラスからインラインに移動することでクラッシュを回避できますが (恐ろしいことです!)、明らかにこれは実行可能な長期的な解決策ではありません。

洞察をありがとう!

更新: プロジェクトの詳細について尋ねられました。もちろん、これを提供します。ただし、最初に、質問は ESP 値が保存されていないというエラーに完全に関連しているわけではありません。私が最も興味を持っているのは、vtable に奇妙な値が表示される理由です。とはいえ、ここにいくつかの追加情報があります。ソリューションはいくつかの外部および内部プロジェクトに依存していますが、これらは長い間変更されておらず、すべて同じ呼び出し規則を使用しています。壊れているように見えるコードはすべて、ソリューションの 1 つのかなり標準的な C++「メイン」プロジェクト内にあります。すべてのコードは同じコンパイラでビルドされます。このソリューションでは、DLL も使用しませんが、多くの静的ライブラリにリンクしています。

SHFolder.lib、python25.lib、dxguid.lib、d3d9.lib、d3dx9.lib、dinput8.lib、ddraw.lib、dxerr9.lib、ws2_32.lib、mss32.lib、Winmm.lib、vtuneapi.lib、vttriggers。 lib、DbgHelp.lib、kernel32.lib、user32.lib、gdi32.lib、winspool.lib、comdlg32.lib、advapi32.lib、shell32.lib、ole32.lib、oleaut32.lib、uuid.lib、odbc32.lib、 odbccp32.lib

0 投票する
1 に答える
3457 参照

interface - Managed C++ のインターフェイス クラス

Managed C++ のインターフェイスは、内部で静的メソッドとメンバーを許可しているため、私には少し奇妙に見えます。たとえば、以下は有効な MC++ インターフェイスです。

さて、私の質問は、インターフェイスでの静的メソッドの使用は何ですか。そして、仮想テーブルなどに何が起こったのか。このインターフェースを実装するクラスの仮想テーブルはどうなるでしょう。頭に浮かぶ質問はたくさんあります。このタイプのクラス、つまりインターフェイス クラスは、ここでは非静的メソッドを定義できないため、単純な抽象クラスと同等ではありません。

インターフェイスで静的を許可することの知恵を知りたいだけです。これは確かに、IMO の OOP 原則に反しています。

0 投票する
2 に答える
2246 参照

c++ - v-table サンクを使用してプロシージャ コールを連鎖させる

Vtable サンクに関するネット上の記事を読んでいましたが、サンクを使用して /chain プロシージャ呼び出しをフックできることをどこかで読みました。

それは達成可能ですか?

それがどのように機能するか知っている人はいますか? また、サンクを説明する適切なリソースを見つけることができません。そのための提案はありますか?

0 投票する
2 に答える
1233 参照

c++ - 派生、具象、クラスの vtable

1 つの基本クラスがあり、そこから 10 個の異なる具体的な派生クラスを派生させた場合、すべての具体的な派生クラスはそれぞれ異なる vtable を持ちますか?

0 投票する
4 に答える
10019 参照

c++ - 仮想関数と多重継承の場合のオブジェクト レイアウト

最近のインタビューで、仮想関数と多重継承を伴うオブジェクト レイアウトについて尋ねられました。
多重継承を伴わずに実装する方法 (つまり、コンパイラが仮想テーブルを生成する方法、各オブジェクトに仮想テーブルへの秘密のポインターを挿入する方法など) のコンテキストで説明しました。
私の説明には何かが欠けているように思えました。
ここに質問があります(以下の例を参照)

  1. クラス C のオブジェクトの正確なメモリ レイアウトを教えてください。
  2. クラス C の仮想テーブル エントリ。
  3. クラス A、B、および C のオブジェクトのサイズ (sizeof によって返される) (8、8、16 ??)
  4. 仮想継承を使用するとどうなりますか。確かに、サイズと仮想テーブルのエントリが影響を受けるはずですか?

コード例:

ありがとう!