eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingWywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja › Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.nask.pl!new
    s.nask.org.pl!news.onet.pl!not-for-mail
    From: Paweł Kierski <n...@p...net>
    Newsgroups: pl.comp.programming,pl.comp.lang.c
    Subject: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Date: Thu, 06 Aug 2009 09:22:36 +0200
    Organization: http://onet.pl
    Lines: 58
    Message-ID: <h5e0bt$qa5$1@news.onet.pl>
    References: <h5d3t9$g7h$1@inews.gazeta.pl>
    Reply-To: n...@p...net
    NNTP-Posting-Host: 91.197.12.15
    Mime-Version: 1.0
    Content-Type: text/plain; charset=UTF-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: news.onet.pl 1249543357 26949 91.197.12.15 (6 Aug 2009 07:22:37 GMT)
    X-Complaints-To: n...@o...pl
    NNTP-Posting-Date: Thu, 6 Aug 2009 07:22:37 +0000 (UTC)
    User-Agent: Mozilla-Thunderbird 2.0.0.0 (X11/20070601)
    In-Reply-To: <h5d3t9$g7h$1@inews.gazeta.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:183031 pl.comp.lang.c:283983
    [ ukryj nagłówki ]

    Mariusz Marszałkowski wrote:
    > Witam
    >
    > Mam pytanie:
    > Czy w kompilatorach C++ ktoś zaimplementował jakieś optymalizacje do
    > metod wirtualnych? Chodzi mi o jakąś technikę, dzięki której kompilator
    > może wygenerować szybszy kod dla wywołań wirtualnych niż dla zwykłych
    > wskaźników do funkcji.
    >
    > Można w C stworzyć np. taką strukturę:
    >
    > struct X {
    > void (*metoda_1)( struct X *x );
    > void (*metoda_2)( struct X *x , int a , int b );
    > int a,b;
    > };
    >
    > A następnie posługiwać się nią bardzo podobnie jak klasą z metodami
    > wirtualnymi:
    >
    > struct X *x = malloc(sizeof(struct X));
    > inicjalizacja( x );
    > x->metoda_1( x );
    > x->metoda_2( x , 1 , 2 );

    Wątpię - implementacja w C++ może być nawet wolniejsza, bo odpowiada
    raczej:

    struct X {
    vptr_X* vptr;

    int a, b;
    };

    struct vptr_X {
    void (*metoda_1)( struct X *x );
    void (*metoda_2)( struct X *x , int a , int b );
    };

    a wywołania są niejawnie rozwijane do:

    x->vptr->metoda_1(x);

    Oszczędza to miejsce w obiekcie, upraszcza RTTI (vptr_X tak naprawdę
    może zawierać więcej informacji o klasie, np. informacje o klasach
    bazowych), upraszcza inicjalizację obiektu (wypełnienie jednego pola).

    Optymalizacja może dotyczyć sytuacji ze znanym statycznym typem -
    wtedy po prostu wołana odpowiednia jest metoda (statycznie znany adres).

    To "wolniejsze" to jednak co najwyżej dodatkowe odwołanie do pamięci.
    A jeśli bijesz się o nanosekundy (bo wszystkie inne możliwości
    optymalizacji wykorzystąłeś), to i tak raczej omijasz polimorfizm,
    jakkolwiek zaimplementowany.

    --
    Paweł Kierski
    n...@p...net

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: