[C++] Wskaźniki na funkcje i metody, a słowo kluczowe sizeof
Ostatnio zmodyfikowano 2012-09-28 16:32
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 #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(); }
|
|
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: |
|
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. |
|
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). |
|
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 |
|
« 1 » |