Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для crashtuak

Старожил


Сообщения: 467
Благодарности: 25

Профиль | Отправить PM | Цитировать


pva, спасибо, чтиво интереснейшее. Сам я работаю на Java, и для меня привычно, когда абсолютно все что можно, скрыто за интерфейсами, и простым кастом можно привести объект наследника к одному из нескольких интерфейсов. А в с++, как оказалось, не все так просто. Вот что получилось у меня:
Код: Выделить весь код
class i1
{
  virtual m1() = 0;
};
class i2
{
  virtual m2() = 0;
};
class impl : public i1, public m2
{
  //implementation of i1,i2
}
//main
impl* implInst = new impl();
i2* i2Cast = (i2*)implInst;
И каково было мое удивление, когда вызывался m1() . Как оказалось, компилятор под видом i2 принял i1(который в impl первый в памяти), обратился к i1_vtable, и вызвал m1(). И, кстати, при передаче наследника в методы вида void doSomething(i2*) генерируется код, идентичный для dynamic_cast<>, так что, скорее всего, избежать dynamic_cast<> не выйдет. Для примера
Код: Выделить весь код
	Action* v = dynamic_cast<Action*>(с);
00E93BEF  cmp         dword ptr [ff],0  
00E93BF3  je          wmain+143h (0E93C03h)  
00E93BF5  mov         eax,dword ptr [ff]  
00E93BF8  add         eax,4  
00E93BFB  mov         dword ptr [ebp-130h],eax  
00E93C01  jmp         wmain+14Dh (0E93C0Dh)  
00E93C03  mov         dword ptr [ebp-130h],0  
00E93C0D  mov         ecx,dword ptr [ebp-130h]  
00E93C13  mov         dword ptr [v],ecx  
	doAction(ff);
00E93C16  cmp         dword ptr [ff],0  
00E93C1A  je          wmain+16Ah (0E93C2Ah)  
00E93C1C  mov         eax,dword ptr [ff]  
00E93C1F  add         eax,4  
00E93C22  mov         dword ptr [ebp-130h],eax  
00E93C28  jmp         wmain+174h (0E93C34h)  
00E93C2A  mov         dword ptr [ebp-130h],0  
00E93C34  mov         ecx,dword ptr [ebp-130h]  
00E93C3A  push        ecx  
00E93C3B  call        doAction (0E91226h)  
00E93C40  add         esp,4
где ff реализует Action, возможно, что то поменялось бы с оптимизациями(код дебажный), но я не думаю, что одинаковый код можно по разному оптимизировать .
UPD: хотя, скорее всего, в других ситуациях dynamic_cast выдаст более навороченый код, чем в данном случае.

-------
Мне надо не так много "Полезных сообщений", чтоб сровнять их количество с моими постами :).


Последний раз редактировалось crashtuak, 17-08-2013 в 17:20.


Отправлено: 17:13, 17-08-2013 | #3