2009-04-01 10 views

Antwort

1

Für Intel C++ - Compiler, für Linux, fand ich es den Anfang des Objekts.

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

Was meinen Sie "am Anfang der Funktion"? Jedenfalls setzen Windows-Compiler vptr auf den Offset 0 eines Objekts, während Unix-Compiler es nach den letzten Mitgliedsdaten setzen. Intel erzeugt Compiler für Windows und Unix, und ich würde erwarten, dass die Win-Version vptr am Anfang und die * nix-Version am Ende des Objekts setzt.

0

Die Position des Vtable-Zeigers im Objekt ist nicht vom Betriebssystem abhängig. Es ist nur eine Konvention des Compilers und anderer Werkzeuge.

SID Datta, können Sie diese Informationen von ICC entdecken, die einige kompilierte Module zerlegen.

3

Sie können immer schauen, wo diese und die erste Adresse in der abgeleiteten Klasse befinden sich:

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

auf meinem Linux-Box, ist das Ergebnis:

bfdbef3c bfdbef40 

... das ist genau das, was Sie erwarten würden: Der erste Zeiger plus die Größe eines virtuellen Funktionszeigers ist der Ort des zweiten.

+0

Warum ist es kein Fehler, den das Programm kompiliert? (Die virtuelle do_foo-Funktion ist nicht in der 'bar'-Klasse definiert.) Die Balkenklasse hat zwar ein' do_foo'-Element, ist aber nicht virtuell. – Arafangion

0

Außer Ihre Neugier die wirkliche Antwort auf Ihre Frage zu befriedigen ist nicht sehr nützlich sein wird, wie die C++ Standard Details wird nicht definiert, wie diese. Daher kann jeder Compiler-Anbieter diese Funktionen so implementieren, wie sie es für richtig halten. Dies ist einer der Gründe, warum es keine plattformübergreifende ABI (Application Binary Interface) für C++ gibt.

+0

Ich verstehe, weshalb ich Intel C++ (Icpc) -Compiler angegeben habe. Allerdings habe ich die Antwort gefunden, also ist alles gut! Trotzdem danke :) –

Verwandte Themen