![]() |
размерность указателя на метод класса
Здравствуйте!
Хотел спросить о размерности указателя на функцию. Я был удивлен результатами, которые выдал VC++(6.0 и .net): class A { void foo(); }; class B { void foo(); }; class C : A { void foo(); //sizeof(&C::foo()) = 4; }; class C : A, B { void foo(); //sizeof(&C::foo()) = 8; }; class C : A, virtual B { void foo(); //sizeof(&C::foo()) = 12; }; Очень хотелось бы получить аргументированное объяснение. Заранее благодарен. |
Из твоего кода не очень понятно каким образом и где ты получил sizeof твоей функции ( обращение &C::foo() не пойдет поскольку foo не статик). А вообще, размер любого указателя обычно 4 байта (то бишь DWORD).
|
уточнение к вопросу
запись sizeof(&C::foo()) - условная
для точности поясню: C c; sizeof(&c.foo()) = ...; Та размерность, которую я указал, соответствует действительности (это легко проверить). |
>>C c;
>>sizeof(&c.foo()) = ...; Это не размер указателя на функцию. По порядку: сначала отрабатывает c.foo() , то есть вызываеться функция foo обьекта с, эта функция возвращает какое-то значение от которого ты получаешь адресс, а потом берешь sizeof от него. По большому, такой код даже компилироваться не должен поскольку у тебя нет тела функции и возвращаемое значение типа void. Указателем на функцию ,как известно, являеться ее имя. А запись - c.foo() являеться вызовом этой функции. |
P.S. Ты бы код поподробнее привел, что бы разобраться можно было.
|
уточнение
class A
{ public: void foo(); }; class B { public: void foo(); }; class C1 : A { public: void foo(); }; class C2 : A, B { public: void foo(); }; class C3 : A, virtual B { public: void foo(); }; int a = sizeof(&C1::foo);//4 a = sizeof(&C2::foo);//8 a = sizeof(&C3::foo);//12 |
>>int a = sizeof(&C1::foo);//
То же не совсем корректно. Ты берешь адресс указателя, а от него - sizeof. Наверное правилнее написать int a = sizeof(C1::foo); Ведь имя функции это уже и есть указатель. Только копилятор ругаеться, cу... Но дело даже не в этом. Все равно по правильному даже такая запись(int a = sizeof(&C1::foo); должна возвращать всегда 4. Так-что налицо небольшой глючок. Если сможешь поробуй в каком нибудь другом компиляторе, Borland например. |
Часовой пояс GMT +4, время: 07:42. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.