-
1. Data: 2009-12-21 09:49:25
Temat: adres metody w vtable
Od: Krzysztof Poc <f...@w...pl>
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;
}
-
2. Data: 2009-12-21 14:51:17
Temat: Re: adres metody w vtable
Od: Krzysiek Kowaliczek <k...@g...com>
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
-
3. Data: 2010-01-04 03:03:03
Temat: Re: adres metody w vtable
Od: Mariusz Marszałkowski <m...@g...com>
On 21 Gru 2009, 15:51, Krzysiek Kowaliczek
<k...@g...com> wrote:
> 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.
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?