2009-04-01 8 views

Répondre

1

Pour le compilateur Intel C++, pour Linux, j'ai trouvé que c'était 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]); 
} 
0

Que voulez-vous dire "au début de la fonction"? Quoi qu'il en soit, les compilateurs Windows mettent vptr à l'offset 0 d'un objet, alors que le compilateur Unix le met après les données du dernier membre. Intel produit des compilateurs pour Windows et Unix, et je m'attendrais à ce que la version Win place vptr au début, et la version * nix à la fin de l'objet.

0

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

Sid Datta, vous pouvez découvrir cette information d'ICC démontant un module compilé.

3

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 

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

+0

Pourquoi ce programme ne compile-t-il pas un bogue? (La fonction do_foo virtuelle n'est pas définie dans la classe 'bar') La classe barre possède en effet un membre 'do_foo', mais ce n'est pas virtuel. – Arafangion

0

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 bon lui semble. C'est l'une des raisons pour lesquelles il n'y a pas d'interface ABI (application binary interface) multi-plateforme pour C++.

+0

Je comprends, c'est pourquoi j'ai spécifié le compilateur Intel C++ (icpc). Cependant, j'ai trouvé la réponse, donc tout va bien! Merci quand même :) –

Questions connexes