SORU
22 EYLÜL 2010, ÇARŞAMBA


Neden Bunun bir int sadece 31 bit mi?

Bu "" başka. herhangi bir yere özelliği görmedim 32 bit çöp toplama için kullanılan biliyorum. Ama neden diğer temel türleri için değer vermez sadece için değil, öyle mi?

CEVAP
22 EYLÜL 2010, ÇARŞAMBA


Bu bir denirişaretçi etiketlitemsil ve yıllardır oldukça yaygın bir optimizasyon hile birçok farklı tercümanlar kullanılan, VMs ve çalışma sistemleri. Hemen hemen her Lisp uygulaması onları kullanır, birçok VMs, Ruby tercüman çok, Smalltalk.

Genellikle, bu dillerde, her zaman nesne işaretçileri dağıtın. Bir nesnenin kendisi oluşur bir nesne Başlığı içeren bir nesne (meta gibi türünde bir nesne, class(es), belki erişim kontrol kısıtlamaları veya güvenlik ek açıklamaları ve benzeri), ve daha sonra gerçek nesne veri kendisi. Yani, basit bir tamsayı işaretçisi artı bir nesne meta veri ve gerçek tamsayı oluşan gösterilemeyecek. Hatta çok küçük bir temsil ile, basit bir tamsayı için 6 Byte gibi bir şey.

Ayrıca, hızlı tamsayı aritmetik gerçekleştirmek için CPU için böyle bir tamsayı nesne geçmek. Eğer iki tamsayılar eklemek istiyorsanız, sizegerçektensadece eklemek istediğiniz iki tamsayı nesneleri nesne başlıkları sözcüğün iki işaretçiler var. Yani ilk tamsayı veri depolandığı için nesneye uzaklık eklemek için ilk ifadesini tamsayı aritmetik gerçekleştirmek gerekiyor. Daha sonra bu adresi inceleyebilirsiniz. Yine aynı ikinci tamsayı. Şimdi aslında eklemek için CPU sorabilirsiniz iki tamsayılar var. Tabii ki, şimdi sonuç tutmak için bir tamsayı olan yeni bir nesne oluşturmak gerekir.

Gerçekleştirmek için yanibirtamsayı ayrıca, aslında gerçekleştirmek gerekirüçtamsayı eklemeler iki işaretçi artı inşaat bir nesne artı dererefences. Ve neredeyse 20 Bayt al.

Ancak, hile sözde iledeğişmez değer türleritamsayılar gibi, genellikle yokgerektüm meta veri nesnesi Başlığı: bırak tüm bu şeyler, ve sadece sentez bu (VM-inek-konuşmak için "sahte"), zaman kimsenin umurunda bak. Bir tamsayı olacaktırher zamansınıf ** 0, ayrı ayrı bu bilgileri saklamak için gerek yok. Eğer birini kullanır yansıması anlamaya sınıfının bir tamsayı, sadece yanıtla Integer ve kimse bilmeyecek bunu gerçekten yapmadın deposu bu Bilgi nesnenin Başlığı bu aslındadeğilhatta nesne bir başlık (veya bir nesne).

Yani, hile değeri saklamak içinişaretçi içinde nesneiçinnesne, etkin bir tanesi çöküyor.

CPU vardır aslında bir işaretçi içinde ek boşluk olan (sözdetag bitsenin içinde işaretçi işaretçi hakkında ek bilgi kendini saklamak için izin verir. Ek bilgi "Bu aslında bir işaretçi değil, bu bir tam sayıdır" gibi. Örnekler Burroughs B5000, çeşitli Lisp Makineleri veya AS/400 vardır. Ne yazık ki, şimdiki ana işlemcilerin çoğu özellik yok.

Ancak, bir çıkış yolu var: en son ana İşlemci çalışma adresleri sözcük sınırlarına hizalı değil zaman önemli ölçüde daha yavaş. Hatta bazıları tarafsız erişim hiç destek yok.

Bunun anlamı pratikte bu netümişaretçileri . bu da demek ki 4 ile bölünebilirher zaman0 İki bit ile son. Bu bizi ayırt edebilirizgerçekaslında kılık değiştirmiş (1 ile biten o) tamsayılar olan işaretçiler (00 ve son) ve işaretçiler. Ve hala 10 ücretsiz diğer şeyler yapmak biten tüm işaretçiler bize bırakıyor. Ayrıca, en modern işletim sistemleri rezerv çok düşük adresleri için kendilerini, bizim için başka bir alana karışıklık çevrede ile (işaretçiler ile başlayan, diyelim ki, 24 0s ve sonu 00).

Yani, sadece sola 1 bit kaydıran ve 1 ekleyerek bir işaretçi 31-bit bir tamsayı kodlama yapabilirsiniz. Ve gerçekleştirebilirsinizçok hızlıtamsayı aritmetik sadece bunları uygun şekilde kaydırarak o, (bazen bile bu gereklidir).

Biz diğer Adres alanları ne yapacağız? Evet, tipik örnekler kodlama floats diğer büyük adres alanı ve bir dizi özel nesneler gibi true, false, nil, Bu 127 ASCII karakterler, bazı sık kullanılan kısa ipler, boş liste boş nesne, boş bir dizi ve çok yakın 0 Adres.

MRI, YARV ve Rubinius Ruby çevirmeni örneğin, tamsayılar adresi 0 yukarıda açıkladığım şekilde, false kodlanmış kodlanmış sadece (ki böyle oluyorayrıcaolmak gösterimi false C) true Adres 2 (sadece çok olur C gösterimi true değişti bir bit) ve nil 4.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CrazyMan

    CrazyMan

    14 Mayıs 2008
  • DetroitBORG

    DetroitBORG

    29 Temmuz 2008
  • Friday Night Cranks

    Friday Night

    27 Mayıs 2007