Neden yok C# derleyicisi bu tercüme=! eğer a > sanki karşılaştırılması; karşılaştırma?
Tamamen şans eseri C keşfettim# derleyicisi bu yöntem açar:
static bool IsNotNull(object obj)
{
return obj != null;
}
...bu işe CIL:
.method private hidebysig static bool IsNotNull(object obj) cil managed
{
ldarg.0 // obj
ldnull
cgt.un
ret
}
...ya da, eğer varsa decompiled C bakmak isterseniz# kod:
static bool IsNotNull(object obj)
{
return obj > null; // (note: this is not a valid C# expression)
}
Nasıl !=
olarak çevrilmiş olur gel ">
"?
CEVAP
Kısa cevap:
"Eşit karşılaştırmak" IL anlatım, C# !=
operatör tam yazışmalar vardı ve kelimenin tam anlamıyla tercüme edilmiştir. o yüzden hiç yok
Orada ancak bir "mukayese-eşit" Yönerge (ceq
, doğrudan yazışma ==
operatör), genel durum, x != y
alır çevrilmiş gibi onun biraz daha uzun eşdeğer (x == y) == false
.
Varayrıcabir "karşılaştırma büyük-daha" talimat IL (cgt
) sağlayan derleyici için bazı kısayollar (yani üretmek daha kısa rı), bir varlık eşitsizlik karşılaştırmalar maddelere karşı boş obj != null
, tercüme gibi "obj > null
".
Hadi biraz daha detaya.
Eğer "eşit karşılaştırmak" IL talimat, nasıl aşağıdaki yöntem derleyici tarafından tercüme alacak? eğer yok
static bool IsNotEqual(int x, int y)
{
return x != y;
}
Zaten, derleyici (x == y) == false
içine x != y
dönecek yukarıda " dedi
.method private hidebysig static bool IsNotEqual(int32 x, int32 y) cil managed
{
ldarg.0 // x
ldarg.1 // y
ceq
ldc.i4.0 // false
ceq // (note: two comparisons in total)
ret
}
Derleyici her zaman uzun soluklu bu oldukça desen üretmez çıkıyor. Biz sürekli 0 ile y
yerine ne olur: görelim
static bool IsNotZero(int x)
{
return x != 0;
}
IL üretilen genel durumda daha kısadır
.method private hidebysig static bool IsNotZero(int32 x) cil managed
{
ldarg.0 // x
ldc.i4.0 // 0
cgt.un // (note: just one comparison)
ret
}
Derleyici olabilir yararlanmak aslında bu imzalı tamsayı saklanır two's complement (burada, eğer elde edilen bit desen yorumlanır işaretsiz tamsayı-o ne .un
araçlar-0 en küçük Olası değeri) çevirir x == 0
olarak unchecked((uint)x) > 0
.
Derleyici null
karşı eşitsizlik çekler için aynı şeyi yapabilirsiniz çıkıyor:
static bool IsNotNull(object obj)
{
return obj != null;
}
Derleyici neredeyse IsNotZero
aynı IL üretir:
.method private hidebysig static bool IsNotNull(object obj) cil managed
{
ldarg.0
ldnull // (note: this is the only difference)
cgt.un
ret
}
Görünüşe göre, derleyici null
referans bit deseni en küçük bit deseni herhangi bir nesne başvurusu için olası olduğunu ifade etmek için izin verilir.
Bu kısayol açıkça Common Language Infrastructure Annotated Standard (1st edition from Oct 2003) belirtilen (Tablo Dipnot olarak sayfa 491, 6-4, "İkili Karşılaştırmalar veya Şube İşlemleri"):
"
cgt.un
ObjectRefs (O) izin ve doğrulanabilir. Bu boş bir ObjectRef ("- - eşit karşılaştırın aksi takdirde daha belirgin bir çözüm olurdu" talimatı)." yok karşılaştırırken yaygın olarak kullanılır
Neden't varsa PyPy 6.3 kat daha h...
Neden Python karşılaştırma dizeleri ku...
Neden gcc eğer hız yerine BOYUTU için ...
Neden eğer sözlük anahtarı varsa kontr...
Bu "yeterli" rasgele algorit...