Où compilateur Intel C ++ stocker le VPTR (pointeur vers la table de fonction virtuelle) dans un objet?

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

  •  22-08-2019
  •  | 
  •  

Question

Où compilateur Intel C ++ stocker le VPTR (pointeur vers la table de fonction virtuelle) dans un objet?

Je crois MSVC qu'il met au début de l'objet, gcc à la fin. Qu'est-ce que pour ICPC (compilateur Intel C ++)?

Était-ce utile?

La solution 2

Pour le compilateur Intel C, pour Linux, je l'ai trouvé le début de l'objet.

Code:

#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]);
}

Autres conseils

Vous pouvez toujours regarder où cela et la première adresse dans la classe dérivée sont situés:

#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();
}

Sur ma boîte Linux, le résultat est:

bfdbef3c bfdbef40

... ce qui est exactement ce que vous attendez:. Le premier pointeur, plus la taille d'un pointeur de fonction virtuelle, est l'emplacement du second

Que voulez-vous dire « au début de la fonction »? Quoi qu'il en soit, les compilateurs de Windows mis VPTR à l'offset 0 d'un objet, tandis que le compilateur Unix mis après les dernières données membres. Intel produit des compilateurs pour Windows un Unix, et j'attendre à ce que la version Win met VPTR au début, et la version * nix à la fin de l'objet.

La position du pointeur vtable dans l'objet ne soit pas lié au système d'exploitation. Il est seulement une convention du compilateur et d'autres outils.

Sid Datta, vous pouvez découvrir cette information de la CPI désassembler certains module compilé.

Sauf pour satisfaire votre curiosité la vraie réponse à votre question ne va pas être très utile, car la norme C ++ ne définit pas les détails comme celui-ci. Par conséquent, tout fournisseur de compilateur peut implémenter ces fonctionnalités comme ils l'entendent. Ceci est l'une des raisons pour lesquelles il n'y a pas multi-plateforme ABI (Application Binary Interface) pour C ++.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top