Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

adres metody w vtable

1 view
Skip to first unread message

Krzysztof Poc

unread,
Dec 21, 2009, 4:49:25 AM12/21/09
to
Witajcie

Czy ktos moze wie dlaczego ponizszy program nieprawidlowo pokazuje
adres metody
Inc() pobranej z vtable.

Bardzo dziekuje za pomoc.

#include <iostream>

using namespace std;

class Human
{
public:
virtual void Set ( void )
{
}

virtual void Inc ( void )
{
uintptr_t *t = reinterpret_cast <uintptr_t*> (this);
uintptr_t *vptr = reinterpret_cast <uintptr_t*> (*t);
uintptr_t *set = reinterpret_cast <uintptr_t*> (*vptr);
uintptr_t *inc = reinterpret_cast <uintptr_t*> (*(vptr+4));

cout << hex << t << endl;
cout << hex << vptr << endl;
cout << hex << set << endl;
cout << hex << inc << endl; // !!! ZLY ADRES !!! :(
}
};

void Action ( Human &human )
{
human . Set ();
human . Inc ();
}

int main ( void )
{
Human human;
Action ( human );
return 0;
}

Krzysiek Kowaliczek

unread,
Dec 21, 2009, 9:51:17 AM12/21/09
to
Użytkownik Krzysztof Poc napisał:

> Witajcie
>
> Czy ktos moze wie dlaczego ponizszy program nieprawidlowo pokazuje
> adres metody
> Inc() pobranej z vtable.
>
[...]

> uintptr_t *inc = reinterpret_cast <uintptr_t*> (*(vptr+4));

Podpowiedź. O jaką wartość zostanie przesunięty wskaźnik vptr?
Na pewno nie o 4 bajty.
BTW. po co Ci to? Skąd wiesz jak kompilator implementuje metody
wirtualne? Standard nic nie mówi na ten temat. To jest zależne
od implementacji kompilatora.

Pozdrawiam
KK

Mariusz Marszałkowski

unread,
Jan 3, 2010, 10:03:03 PM1/3/10
to
On 21 Gru 2009, 15:51, Krzysiek Kowaliczek

Nie pamiętam już gdzie, ale chyba pamiętam po co, zrealizowano
metody wirtualne w postaci globalnej tablicy adresów, a wewnątrz
składowych klasy zamieszczono indeksy do owej globalnej tablicy.

A po co? Po to aby zaoszczędzić na pamięci, można obliczyć
co do jednego bitu ile potrzeba pamięci na każdy indeks, natomiast
adres metody wirtualnej to zawsze kilka bajtów.

Apropo, przez takie sztuczki jeden z moch starych programów
nie działa po skompilowaniu VC7 lub nowszym :)

Pozdrawiam

tablicy?

0 new messages