Yanıtlar:
Çünkü CPU, bayttan daha küçük bir şeyi adresleyemez.
bt
, bts
, btr
ve btc
olabilir tek bit adres!
bt
bir bayt ofsetini ele alıyor ve sonra biti belirli bir ofsette test ediyor, bayt cinsinden girdiğiniz bir adresi belirtirken ... bit ofset değişmezleri biraz kelime gibi olur (özür dilerim).
Gönderen Vikipedi :
Tarihsel olarak, bir bayt, bir bilgisayardaki tek bir metin karakterini kodlamak için kullanılan bit sayısıdır ve bu nedenle , birçok bilgisayar mimarisinde temel adreslenebilir öğedir .
Bayt olduğunu Yani temel adreslenebilir birim , aşağıda bilgisayar mimarisi adresi olamaz. Ve (muhtemelen) 4 bitlik baytı destekleyen bilgisayarlar olmadığından, 4 bit vb. bool
Ancak, temel adreslenebilir birim olarak 4 biti adresleyebilen böyle bir mimari tasarlayabilirseniz, o zaman bool
yalnızca o bilgisayarda 4 bit boyutuna sahip olursunuz !
int
ve char
gönderimden.
bool
, çünkü C ++ 'dakichar
en küçük adreslenebilir birim , mimarinin kendi işlem kodlarıyla neyi ele alabildiğine bakılmaksızın. en az 1 değerine sahip olmalı ve bitişik nesnelerin C ++ ' da kendi adresleri olmalıdır , bu nedenle uygulama onları büyütmeli ve hafızayı boşa harcamalıdır. Bu nedenle bit alanları özel bir durum olarak mevcuttur: Bir yapının bit alanı üyelerinin ayrı ayrı adreslenebilir olması gerekmez, bu nedenle a'dan daha küçük olabilirler (tüm yapı hala olamaz). sizeof(bool)
bool
char
char
C ++ 'da adreslenebilir en küçük birim olduğunu söylediği dil spesifikasyonundan referans verebilir misiniz ?
sizeof(bool)
0.5 :-) olamaz. Sanırım bir uygulama yasal olarak bir uzantı olarak alt bayt işaretçileri sağlayabilir, ancak sıradan yollarla tahsis edilen bool gibi "sıradan" nesneler, standardın söylediğini yapmak zorundadır.
En kolay cevap; Bunun nedeni CPU'nun belleği bit olarak değil bayt cinsinden adreslemesi ve bitsel işlemlerin çok yavaş olmasıdır.
Bununla birlikte, C ++ 'da bit boyutu ayırmayı kullanmak mümkündür. Bit vektörleri için std :: vektör uzmanlaşması ve ayrıca bit boyutlu girdiler alan yapılar vardır.
Eski günlerde, şiddetli bir kar fırtınasında, her iki yönde de yokuş yukarı okula yürümek zorunda kaldığım ve öğle yemeğinin, okulun arkasındaki ormanda izleyip çıplak ellerimizle öldürebileceğimiz hayvan olduğu zamanlarda, bilgisayarların hafızası çok daha azdı. bugün. Şimdiye kadar kullandığım ilk bilgisayarda 6K RAM vardı. 6 megabayt değil, 6 gigabayt değil, 6 kilobayt. Bu ortamda, olabildiğince çok boolean bir int içine yerleştirmek çok mantıklıydı ve bu yüzden onları çıkarmak ve yerleştirmek için düzenli olarak işlemleri kullanırdık.
Bugün, insanlar yalnızca 1 GB RAM'e sahip olduğunuz için sizinle dalga geçecek ve 200 GB'den daha az bir sabit diski bulabileceğiniz tek yer bir antika dükkanı olduğunda, bit paketlemeye değmez.
Alt boyuttaki tam sayıları elde etmek için bit alanlarını kullanabilirsiniz.
struct X
{
int val:4; // 4 bit int.
};
Genellikle yapıları donanımdan beklenen tam bit desenleriyle eşlemek için kullanılsa da:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
1 bitlik bool'lara ve 4 ve 2 bitlik girişlere sahip olabilirsiniz. Ancak bu, mimariye bakmanın doğal olmayan bir yolu olduğu için, hiçbir performans kazancı sağlamayan garip bir talimat seti oluşturur. Kullanılmayan verileri geri almaya çalışmaktansa, baytın daha iyi bir bölümünü "harcamak" aslında mantıklı.
Tecrübelerime göre, birkaç bool'u tek bir bayta yerleştirmeyi zahmet eden tek uygulama Sql Server'dır.
bool
bir bayt olabilir - adreslenebilir en küçük CPU boyutu veya daha büyük olabilir. Performans amacıyla bool
boyutunun olması alışılmadık bir durum değil int
. Belirli amaçlar için (örneğin donanım simülasyonu) N bitli bir türe ihtiyacınız varsa, bunun için bir kitaplık bulabilirsiniz (örneğin, GBL kitaplığının BitSet<N>
sınıfı vardır). Eğer boyutuyla ilgileniyorsanız bool
(muhtemelen büyük bir kabınız var) o zaman parçaları kendiniz paketleyebilir veya std::vector<bool>
sizin için yapacak olanı kullanabilirsiniz (konteyner gereksinimlerini karşılamadığından ikincisine dikkat edin).
Çünkü MIPS gibi bazı CPU'lar 4 baytlık bir kelime kullansa da, CPU genel olarak belleği 1 baytlık temel birim olarak ayırır.
Bununla birlikte , her bool için bir bit olan özel bir şekilde vector
anlaşmalar tahsis edilir.bool
vector<bool>
lw
/ sw
çok daha yaygın olarak kullanılıyor.
Bayt, bir bilgisayarın dijital veri depolama birimidir. Bir bilgisayarda RAM milyonlarca bayta sahiptir ve bunlardan herhangi birinin bir adresi vardır. Her bit için bir adrese sahip olsaydı, bilgisayar yapabildiğinden 8 kat daha az RAM yönetebilirdi.
Daha fazla bilgi: Wikipedia
Mümkün olan minimum boyut 1 Bayt olsa bile, 1 Bayt üzerinde 8 bitlik boole bilgisine sahip olabilirsiniz:
http://en.wikipedia.org/wiki/Bit_array
Örneğin Julia dilinde BitArray var ve C ++ uygulamaları hakkında okudum.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. Çoğu derleyici bir tamunsigned int
ayırır, ancak okurken / yazarken kendileri bit çevirme ile ilgilenirler. Ayrıca modulo işlemlerini kendi başlarına hallederler. Bu a,unsigned small : 4
:) özelliği, 0 ile 15 arasında bir değere sahiptir, ve 16 almak gerekir, bunun önceki bit üzerine değil