インテルC++コンパイラーはvptr(仮想関数テーブルへのポインター)をオブジェクトのどこに格納しますか?
MSVCはそれをオブジェクトの最初に置き、gccを最後に置くと思います。icpc(Intel C ++コンパイラ)とは何ですか?
これと派生クラスの最初のアドレスがどこにあるかをいつでも確認できます。
#include <stdio.h>
class foo
{
public:
virtual int do_foo()=0;
};
class bar : public foo
{
public:
int bar;
int do_foo() {printf ("%08x %08x\n", this, &bar);}
};
int main()
{
bar a_bar;
a_bar.do_foo();
}
私のLinuxボックスでは、結果は次のようになります。
bfdbef3c bfdbef40
...これはまさにあなたが期待することです。最初のポインターと仮想関数ポインターのサイズが2番目のポインターの位置です。
C ++標準ではこのような詳細が定義されていないため、好奇心を満たすことを除いて、質問に対する実際の回答はあまり役に立ちません。したがって、どのコンパイラベンダーも、適切と思われるこれらの機能を実装できます。これが、C ++用のクロスプラットフォームABI(アプリケーションバイナリインターフェイス)がない理由の1つです。
オブジェクト内のvtableポインターの位置は、オペレーティングシステムとは関係ありません。これは、コンパイラと他のツールの慣例にすぎません。
Sid Datta、ICCからの情報がコンパイルされたモジュールを逆アセンブルしていることを発見できます。
「関数の最初に」とはどういう意味ですか? とにかく、Windows コンパイラは vptr をオブジェクトのオフセット 0 に配置しますが、Unix コンパイラは最後のメンバー データの後に配置します。Intel は Windows と Unix の両方に対応するコンパイラを作成しています。Win バージョンでは vptr がオブジェクトの先頭に、*nix バージョンではオブジェクトの最後に配置されると思います。