Uyuşturucu vektör - Dope vector

Olarak bilgisayar programlama , bir dop vektörü a, veri yapısı , bir ilgili bilgileri saklamak için kullanılan bir veri nesnesi , özellikle bellek yerleşimi .

Amaç

Dope vektörleri, genellikle belirli bir veri türünün birden çok örneğini bitişik bir bellek bloğu olarak depolayan dizileri tanımlamak için kullanılır . Örneğin, her biri 32 bayt alan 100 öğe içeren bir dizi, 100 × 32 bayt gerektirir. Tek başına, böyle bir bellek bloğunun dizinin (veya başka bir nesnenin) genel olarak ne kadar büyük olduğunu, içindeki her bir öğenin ne kadar büyük olduğunu veya kaç öğe içerdiğini takip edecek yeri yoktur. Bir uyuşturucu vektörü, bu tür bilgileri depolamak için bir yerdir. Uyuşturucu vektörler ayrıca dizileri veya değişken öğeleri içerebilen yapıları da tanımlayabilir .

Böyle bir dizi, ilk bayt M bellek konumunda olacak şekilde bitişik olarak depolanırsa , son baytı M + 3199 konumunda olur . Bu düzenlemenin önemli bir avantajı, N öğesinin konumunun kolay olmasıdır: M + konumunda başlar ( N × 32) . Tabii ki, 32 değeri bilinmelidir (bu değer genellikle dizinin "adımı" veya dizi elemanlarının "genişliği" olarak adlandırılır). Bir dizin kullanarak bir dizi veri yapısında gezinmeye ölü hesaplama denir .

Bununla birlikte, bu düzenleme (dop vektörleri eklenmeden), N maddesinin konumuna sahip olmanın, N indisinin kendisini keşfetmek için yeterli olmadığı anlamına gelir; veya adım; veya N - 1 veya N + 1'de elemanlar olup olmadığı . Örneğin, bir işlev veya yöntem, bir dizideki tüm öğeleri yineleyebilir ve her birini, öğenin bir dizinin parçası olduğunu bilmeyen başka bir işleve veya yönteme aktarabilir, dizinin nerede veya ne kadar büyük olduğunu çok daha az.

Bir uyuşturucu vektörü olmadan, tüm dizinin adresini bilmek bile size ne kadar büyük olduğunu söylemez. Bu önemlidir, çünkü yalnızca N öğe içeren bir dizideki N + 1 öğesine yazmak büyük olasılıkla diğer bazı verileri yok edecektir. Pek çok programlama dili karakter dizilerini bir tür dizi olarak ele aldığından, bu doğrudan rezil tampon taşması sorununa yol açar .

Bir uyuşturucu vektörü , bir dizi (veya başka bir nesne) ile birlikte az miktarda meta veri depolayarak bu sorunları azaltır . Uyuşturucu vektörleri ile bir derleyici, bir dizinin veya başka bir nesnenin sonunun yanlışlıkla yazılmasını önleyen kodu kolayca (ve isteğe bağlı olarak) ekleyebilir. Alternatif olarak, programcı, güvenlik veya başka amaçlar için istendiğinde uyuşturucu vektörüne erişebilir.

Açıklama

Bir uyuşturucu vektörüne dahil edilen tam meta veri seti, bir dil ve / veya işletim sisteminden diğerine değişir, ancak bir dizi için bir uyuşturucu vektörü şunları içerebilir:

  • dizi öğelerinin başladığı bellekteki konuma bir işaretçi (bu normalde dizinin sıfırıncı öğesinin konumu ile aynıdır (tüm alt simgelerin 0 olduğu öğe). (Bu, alt simgeler başlangıçta başlamazsa ilk gerçek öğe olmayabilir. sıfır.)
  • her dizi öğesinin türü (tamsayı, Boole, belirli bir sınıf , vb.).
  • Bir dizi sıralaması .
  • bir dizinin kapsamı (dizinin aralığı). (Pek çok dilde dizilerin başlangıç ​​dizini sıfır veya bir olarak sabittir, ancak dizi (yeniden) tahsis edildiğinde bitiş dizini ayarlanır.)
  • belirli bir zamanda kullanım kapsamının değişebileceği diziler için, maksimum ve akım kapsamlarının her ikisi de depolanabilir.
  • Bir dizi adım veya bellek miktarı dizisinin her bir elemanı tarafından işgal.

Bir program daha sonra dope vektörüne atıfta bulunarak diziye (veya diğer yardımcı vektör kullanan nesneye) başvurabilir. Bu genellikle yüksek seviyeli dillerde otomatiktir . Dizinin bir elemanına ulaşmak biraz daha pahalıya mal olur (genellikle işaretçiyi uyuşturucu vektöründen gerçek veriye getiren bir talimat). Öte yandan, diğer birçok genel işlemi yapmak daha kolay ve / veya daha hızlıdır:

  • Bir dope vektörü olmadan, dizideki elemanların sayısını belirlemek imkansızdır. Bu nedenle, bir dizinin sonuna "ayrılmış" değerle (NULL gibi) fazladan bir öğe eklemek yaygındır. Uzunluk daha sonra bu "son işaret" e ulaşılana kadar öğeleri sayarak dizi boyunca ileriye doğru taranarak belirlenebilir. Elbette bu, uzunluk kontrolünü doğrudan bir dop vektöründe uzunluğa bakmaktan çok daha yavaş hale getirir.
  • Bir dizinin kapsamını bilmeden, bu belleği artık gerekmediğinde serbest bırakmak () (ayrılmamak) mümkün değildir . Dolayısıyla, uyuşturucu vektörleri olmadan, bir şey bu uzunluğu başka bir yerde saklamalıdır. Örneğin, belirli bir işletim sisteminin 3200 baytlık bir dizi için yer ayırmasını istemek, M konumunda 3204 bayt ayırmasına neden olabilir; daha sonra boyutu ilk 4 baytta depolar ve istekte bulunan programa ayrılan alanın M + 4'te başladığını söyler (böylece arayan kişi fazladan 4 baytı uygun dizinin bir parçası olarak değerlendirmez). Bu fazladan veri bir uyuşturucu vektörü olarak kabul edilmez, ancak aynı hedeflerin bazılarına ulaşır.
  • Doping vektörleri olmadan, dizi elemanlarının ilerlemesi (veya genişliği) hakkında ekstra bilgi de tutulmalıdır. Olarak C , bu bilgi "1000 bayt-genişlikli bir dizi eleman işaretçi" ve "20-bayt-genişlikli bir dizi eleman için işaretçi" arasında bir veri türü ayrım izlemek gerekir derleyici tarafından işlenir. Bu, her iki tür dizideki bir öğeye göstericinin, sonraki veya önceki öğeye ulaşmak için artırılabileceği veya azaltılabileceği anlamına gelir; ama aynı zamanda dizi genişliklerinin daha erken bir aşamada sabitlenmesi gerektiği anlamına gelir.

Bir uyuşturucu vektörü ile bile, bir dizinin belirli bir üyesine (yalnızca) bir göstericiye sahip olmak, dizideki konumu veya dizinin konumunu veya uyuşturucu vektörünün kendisinin bulunmasını sağlamaz. Bu istenirse, bu tür bilgiler dizi içindeki her öğeye eklenebilir. Bu tür eleman başına bilgi yararlı olabilir, ancak uyuşturucu vektörünün bir parçası değildir.

Uyuşturucu vektörler, birden çok veri türü arasında paylaşılan genel bir kolaylık olabilir (yalnızca diziler ve / veya dizeler değil).

Ayrıca bakınız

Referanslar

  1. ^ Pratt, T .; Zelkowitz, M. (1996). Programlama Dilleri: Tasarım ve Uygulama (3. baskı). Upper Saddle River, NJ : Prentice-Hall . s. 114. ISBN   978-0-13-678012-0 .
  2. ^ Claybrook, Billy G. (13–15 Ekim 1976). Genelleştirilmiş bir veri yapısı tanımlama tesisi için bir şablon yapısının tasarımı . ICSE '76: 2. uluslararası yazılım mühendisliği konferansı. San Francisco, California, ABD: IEEE Computer Society Press. s. 408–413.