哪里英特尔C ++编译存储的vptr(指向虚拟函数表)中的对象?
题
哪里英特尔C ++编译(指向虚拟函数表)存储在vptr的对象?
相信MSVC把它放在该目的,在端部的gcc的开始。这是什么为ICPC(英特尔C ++编译)?
解决方案 2
有关英特尔C ++编译器,用于Linux,我发现它是该对象的开始。
代码:
#include <cstdio>
class A
{
int a, b;
public:
A(int a1, int b1): a(a1), b(b1) {}
virtual void p(void) { printf("A\n"); }
};
class B: public A
{
public:
B(int a1, int b1): A(a1, b1) {}
void p(void){ printf("B\n"); }
};
int main(void)
{
A a(1, 2); int p=10; A a1(5, 6);
B b(3, 4); int q=11; B b2(7, 8);
a.p();
b.p();
int * x=(int*)&a;
printf("%d %d %d %d\n", x[0], x[1], x[2], x[3]);
x=(int*)&b;
printf("%d %d %d %d\n", x[0], x[1], x[2], x[3]);
}
其他提示
可以随时看其中这和在派生类的第一个地址位于:
#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
...而这正是你所期望的:第一指针,再加上一个虚函数指针的大小,是第二的位置
你是什么意思“在函数的开始”?无论如何,Windows编译器放的vptr在一个对象的偏移量为0,而Unix的编译器把它放在最后一个成员的数据之后。英特尔编译器产生的用于Windows的Unix的两个,我会想到的是win版之初提出的vptr,并在对象的末尾* nix的版本。
在该对象的虚表指针的位置是不相关的操作系统。这只是编译器和其它工具的惯例。
西特达塔,可以发现从ICC拆卸一些编译模块的信息。
除了满足你的好奇心真正回答你的问题不会是非常有用的,因为C ++标准没有定义这样的细节。因此他们认为合适的任何编译器供应商可以实现这些功能。 这是原因之一不存在交叉平台ABI(应用二进制接口),用于C ++。
不隶属于 StackOverflow