Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wskaźniki na funkcje i metody, a słowo kluczowe sizeof

Ostatnio zmodyfikowano 2012-09-28 16:32
Autor Wiadomość
Admixior
Temat założony przez niniejszego użytkownika
[C++] Wskaźniki na funkcje i metody, a słowo kluczowe sizeof
» 2012-09-27 22:01:57
hymm.. nie miałem pomysłu na temat więc tak nazwałem ;]
Czytając sobie dygresję w innym temacie na temat wskaźników i funkcjach wirtualnych zedytowałem sobie przykład isona.
Tylko dlaczego output (a dokładnie 2 ostatnie cyfry) są różne, czy funkcja w obiekcie klasy to nie to samo co w klasie?
OUTPUT: 4 4 12 4
C/C++
#include <cstdio>

class A
{
public:
    virtual void foo() { };
};

class B
{
public:
    virtual void foo() { };
};

class C
    : virtual public A
    , B
{
public:
    virtual void foo() { };
};

void foo() { }

int main()
{
    printf( "::foo %d\n",( int ) sizeof( & foo ) );
    printf( "A::foo %d\n",( int ) sizeof( & A::foo ) );
    printf( "C1::foo %d\n",( int ) sizeof( & C::foo ) );
    C c;
    printf( "C1::foo %d\n",( int ) sizeof( & c.foo ) );
    getchar();
}
P-65648
DejaVu
» 2012-09-27 22:22:45
error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say '&C::foo' [-fpermissive]|
Dotyczy:
C/C++
sizeof( & c.foo )
P-65652
Admixior
Temat założony przez niniejszego użytkownika
» 2012-09-27 22:59:13
Na msvc intellisense pokazuje jakiś błąd ale kompilator nawet warninga nie daje.
P-65656
Mrovqa
» 2012-09-28 07:50:31
sizeof( & c.foo )
To jest pobranie adresu metody - a jak wiadomo bezsensem byłoby gdyby taki adres miał więcej niż 4 bajty (pod 32-bitową architekturą ofc).
Co do
sizeof( C::foo )
 obstawiam, iż reszta to informacje nt. klasy czy coś w tym rodzaju. Ktoś z tego forum już poprosił Gyna o nagranie następnego VideoCasta na ten temat i gyn się zgodził. Prawdopodobnie w następnym tygodniu będzie już nowy VideoVast gyna ;) A jeśli jesteś dociekliwy to skompilowany przykład sobie zdisassembluj i przeanalizuj (pod G++ a kompilatorem z VC++ będzie różnica).
P-65659
Admixior
Temat założony przez niniejszego użytkownika
» 2012-09-28 16:32:09
[cytat]A jeśli jesteś dociekliwy to skompilowany przykład sobie zdisassembluj[/cytat]
hmm.. już wcześniej robiłem disassembly visualem i jedyne czego się dowiedziałem to że:
mov eax(czy jakiś inny rejestr) ,0x0C ; dla klasy
a później
mov eax, 0x04; dla obiektu klasy

A więc poczekam na filmik od gyna
P-65663
« 1 »
  Strona 1 z 1