哪里英特尔C ++编译存储的vptr(指向虚拟函数表)中的对象?

StackOverflow https://stackoverflow.com/questions/706861

  •  22-08-2019
  •  | 
  •  

哪里英特尔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 ++。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top