операции каста и упа(распа)копки в C++.NET/C#
От: Ael США  
Дата: 05.06.04 09:52
Оценка:
Вот такие классы на C#:

public class Base{}
public class Derived:Base{public Int32 i=5;}


Вот из такого C# кода:

  Base b=new Derived();
    Object o=((Derived)b).i;
    o=((Int32)o)+1;//нельзя написать ((Int32)o)++;
    ((Derived)b).i=(Int32)o;



Получается вот что:

   IL_0000:  newobj     instance void Test_CastComparisonCs.Derived::.ctor()
      IL_0005:  stloc.0    
      IL_0006:  ldloc.0    
      IL_0007:  castclass  class Test_CastComparisonCs.Derived
      IL_000c:  ldfld      int32 Test_CastComparisonCs.Derived::i
      IL_0011:  box        [mscorlib]System.Int32
      IL_0016:  stloc.1    
      IL_0017:  ldloc.1    
      IL_0018:  unbox      [mscorlib]System.Int32
      IL_001d:  ldind.i4   
      IL_001e:  ldc.i4.1   
      IL_001f:  add        
      IL_0020:  box        [mscorlib]System.Int32
      IL_0025:  stloc.1    
      IL_0026:  ldloc.0    
      IL_0027:  castclass  class Test_CastComparisonCs.Derived
      IL_002c:  ldloc.1    
      IL_002d:  unbox      [mscorlib]System.Int32
      IL_0032:  ldind.i4   
      IL_0033:  stfld      int32 Test_CastComparisonCs.Derived::i
      IL_0038:  ret


А с этого на С++.NET
(такие же классы:

public __gc class Base{};
public __gc class Derived:public Base{public:Int32 i;Derived():i(5){}};


)
И вот код:

Base *b=new Derived();
Object *o=__box((static_cast<Derived*>(b)->i));
(*(static_cast<__box Int32*>(o)))++;
(static_cast<Derived*>(b))->i=*(static_cast<__box Int32*>(o));



Получается вот что:


IL_0000:  ldnull     
  IL_0001:  stloc.1    
  IL_0002:  ldnull     
  IL_0003:  stloc.0    
  IL_0004:  newobj     instance void Derived::.ctor()
  IL_0009:  stloc.1    
  IL_000a:  ldloc.1    
  IL_000b:  ldfld      int32 Derived::i
  IL_0010:  box        [mscorlib]System.Int32
  IL_0015:  stloc.0    
  IL_0016:  ldloc.0    
  IL_0017:  unbox      [mscorlib]System.Int32
  IL_001c:  stloc.2    
  IL_001d:  ldloc.2    
  IL_001e:  ldloc.2    
  IL_001f:  ldind.i4   
  IL_0020:  ldc.i4.1   
  IL_0021:  add        
  IL_0022:  stind.i4   
  IL_0023:  ldloc.1    
  IL_0024:  ldloc.0    
  IL_0025:  unbox      [mscorlib]System.Int32
  IL_002a:  ldind.i4   
  IL_002b:  stfld      int32 Derived::i
  IL_0030:  ldc.i4.0   
  IL_0031:  br.s       IL_0033
  IL_0033:  ret


Какие выводы можно сделать из таких результатов? Ну, например, можно убедиться, что С++.NET позволяет делать кое-что, что не может делать C# — а именно изменять упакованную переменную без копирования ее в стек, а прямо в куче.
(еще у Рихтера об этом написано)

Кроме того, в IL коде сгенерированном C++.NET нет ни одной операции castclass.
Интересно, кто что думает по этому поводу?
Какие еще выводы можно сделать из этого сравнения?
Спасибо!
http://web.icq.com/whitepages/online?icq=236755957&img=21
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.