Где Intel C ++ Compiler хранит vptr (указатель на таблицу виртуальных функций) в объекте? - PullRequest
3 голосов
/ 01 апреля 2009

Где Intel C ++ Compiler хранит vptr (указатель на таблицу виртуальных функций) в объекте?

Я полагаю, что MSVC помещает его в начало объекта, gcc в конец. Что это за icpc (Intel C ++ Compiler)?

Ответы [ 5 ]

3 голосов
/ 02 апреля 2009

Вы всегда можете посмотреть, где находится этот и первый адрес в производном классе:

#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

... это именно то, что вы ожидаете: первый указатель плюс размер указателя виртуальной функции - это местоположение второго.

1 голос
/ 02 апреля 2009

Для компилятора Intel 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]);
}
0 голосов
/ 06 апреля 2009

Кроме того, чтобы удовлетворить ваше любопытство, реальный ответ на ваш вопрос не будет очень полезным, так как стандарт C ++ не определяет такие детали, как эта. Поэтому любой поставщик компилятора может реализовать эти функции по своему усмотрению. Это одна из причин, по которой не существует кроссплатформенного ABI (двоичного интерфейса приложения) для C ++.

0 голосов
/ 02 апреля 2009

Положение указателя vtable в объекте не связано с операционной системой. Это всего лишь соглашение компилятора и других инструментов.

Сид Датта, вы можете обнаружить, что информация из ICC разбирает какой-то скомпилированный модуль.

0 голосов
/ 01 апреля 2009

Что вы имеете в виду "в начале функции"? В любом случае, компиляторы Windows помещают vptr со смещением 0 объекта, в то время как компилятор Unix помещает его после данных последнего члена. Intel производит компиляторы как для Windows, так и для Unix, и я ожидаю, что версия Win ставит vptr в начале, а версию * nix в конце объекта.

...