2013-01-11 27 views

cevap

8

64 bit makinede, işaretçiler genellikle sekiz baytlık katları olan sözcük sınırlarında olacak şekilde hizalanır. Sonuç olarak, bir işaretçinin en düşük üç biti sıfır olacaktır. Sonuç olarak, bir veri yapısı üç bit bilgi gerektiriyorsa, bunları bir işaretçinin en düşük üç bitine yerleştirebilir. Bu yolla:

  • İşaretçiyi takip etmek için, işaretçi değerinin en düşük üç bitini temizleyin, ardından bunları düzeltin.
  • Üç bitten herhangi birini okumak için, işaretçideki bitlerin kalanını gizleyin ve doğrudan okuyun.

Bu yaklaşım oldukça standarttır ve genellikle performans veya donanım nedenlerinden ötürü hizalanmayan işaretçiler olmasını istemediğiniz için adresleri işaret etme yeteneğini kaybetmez.

32 bitlik durumda neden bunu yapmadıklarından emin değilim, çünkü üç işaretçisiyle aynı bit kullanarak kolayca bitleri gizleyebildiler ancak işaretçi başına iki bit. Tahminim, bu bir performans meselesidir: eğer bitleri işaretçilerin tabanına yerleştirirseniz, bitleri temizlemek için gerekli hesaplama nedeniyle işaretçiyi takip etme maliyetini artırırsınız. Örneğin, 64 bitlik durumda bitlerin ana gösterici içinde paketlendiğini unutmayın; bu, yalnızca, ardı ardına gelen bilgisayar işlemcileri veya ekleme veya silme işlemlerinde rotasyon yapmak gibi nadir işlemler için kullanılır. Bu aramaları hızlı tutar. 32 bitlik durumda, 3 biti gizlemek için, uygulamanın iki işaretçinin alt bitlerini kullanması gerekir; bunlardan biri sol veya sağ işaretçidir. Tahminimce, yavaşlayan ağaç aramalarının performansındaki isabet, yer tasarrufu yapmaya değmez, bu yüzden sadece bellek isabetini almayı ve bunları ayrı ayrı saklamaya karar verdiler. Bu sadece bir spekülasyon olsa da, eğer istedikleri takdirde bitleri işaretçilerin diplerinde saklamış olabilirler.

Bir yan notta: uygulama AVL ağacı yerine kırmızı/siyah bir ağaç kullanıyorsa, yalnızca iki bit bilgi gerekli olacaktır: düğümün kırmızı mı yoksa siyah mı olduğunu anlamak için bir bit Düğümün sol veya sağ bir çocuk olup olmadığını söyler. Bu durumda, gereken iki bit her zaman 32 bitlik bir işaretçi içine paketlenebilir. Kırmızı-siyah ağaçların popüler olmasının bir nedeni budur.

Bu yardımcı olur umarız!

+0

İnanılmaz! Teşekkür ederim. – Igor

+0

Kaynak dosya, kullanıcı alanı kitaplıkları değil, çekirdek kaynak ağacı olan usr/src/uts/... içinde olduğuna dikkat edin, bu nedenle kullanım durumlarında 32-bit uygulamasının en iyi duruma getirilmesi gerekmeyebilir. tasarlandığında. – alanc

+0

sys/avl.h, kullanıcı alanında da yoğun olarak kullanılmaktadır, e. g. çalışma zamanı linker ve diğer bazı kütüphaneler tarafından. – Igor