eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › adres metody w vtable
Ilość wypowiedzi w tym wątku: 3

  • 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?

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: