Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++ Bug] Bug report 25.07.01 13:21 Число просмотров: 1066
Автор: XR <eXtremal Research> Статус: The Elderman
|
g++ -O0 -S многое поставил на свои места
сейчас попытаюсь надергать избранных кусков из ddd
class Parrent
....
Типа виртуальный метод ? Да ? :)
> > > virtual void PrintMsg() class Child
....
И это тоже ?
> > > virtual void PrintMsg() > > > { > > > TRACE("This function called from class > Child.\n"); > > > } > > >
> > > int main() > > > {
Значится поехали
> > > Child child; > > > Child* pChild = &child; > > > Child& rChild = child; > > > Пропускаю все присвоения и настройки таблиц виртуальных методов
оставляю только сами вызовы
> > > child.PrintMsg(); 0x804872a <main+42>: call 0x8048910 <Child::PrintMsg(void)>
> > > pChild->PrintMsg(); 0x8048744 <main+68>: call *%esi
> > > rChild.PrintMsg(); 0x804875b <main+91>: call *%esi
> > > TRACE("\n"); > > > child.Magic(); > > > TRACE("\n"); > > > child.PrintMsg(); 0x8048796 <main+150>: call 0x8048910 <Child::PrintMsg(void)>
> > > pChild->PrintMsg(); 0x80487b0 <main+176>: call *%esi
> > > rChild.PrintMsg(); 0x80487c7 <main+199>: call *%esi
> > > return 0; > > > } > > > --- > > > > > > > Результат: > > > > This function called from class Child.
> > This function called from class Child.
> > This function called from class Child.
> >
> > Leave Magic.
> >
> > This function called from class Child.
> > This function called from class Parrent.
> > This function called from class Parrent.
> > ---
> > > > Это видимо какие то фокусы с перегрузкой таблицы > > виртуальных функций ? > > УГУ !!! именно такой вот эффект. в сущности получается, что > *pChild != child;
> я над этим примером сотни экспериментов проводил. > впечатление, что у child - таблица статическая, а у всех > остальных, даже если так - > > child.Magic() > pChild = &child; > rChild = child; > > динамическая. монопенисно !!!!!
Хуже :) в первом случае для
Child child
PrintMsg похоже вообще НЕ виртуальный метод
> самое обидное, что GNU вообще не отреагировало на это, даже > культурно послали на news forum, впечатление, что им по > барабану.
Это гнушники ImHO зря ...
а M$ откликнулся - они просто написали каков
> результат, а причину так и не объяснили - отмахнулись ;-)
:)))
Резюме: Умный компилер это хорошо но 2 хороших программера лучше :)
|
|
|