ใน C ++
- เหตุใดบูลีน 1 ไบต์และไม่ใช่ขนาด 1 บิต
- ทำไมไม่มีประเภทเช่นจำนวนเต็ม 4 บิตหรือ 2 บิต
ฉันพลาดสิ่งต่างๆข้างต้นเมื่อเขียนโปรแกรมจำลองสำหรับ CPU
ใน C ++
ฉันพลาดสิ่งต่างๆข้างต้นเมื่อเขียนโปรแกรมจำลองสำหรับ CPU
คำตอบ:
เนื่องจาก CPU ไม่สามารถระบุสิ่งที่เล็กกว่าไบต์ได้
bt
, bts
, btr
และbtc
สามารถอยู่บิตเดียว!
bt
อยู่ไบต์ชดเชยแล้วทดสอบบิตที่ได้รับชดเชยอักษรโดยไม่คำนึงถึงเมื่อระบุที่อยู่ที่คุณจะไปในไบต์ ... บิตชดเชยจะได้รับคำบิต (แก้ตัวเล่นสำนวน)
จากWikipedia :
ในอดีตไบต์คือจำนวนบิตที่ใช้ในการเข้ารหัสข้อความอักขระตัวเดียวในคอมพิวเตอร์และด้วยเหตุนี้องค์ประกอบพื้นฐานที่กำหนดแอดเดรสในสถาปัตยกรรมคอมพิวเตอร์จำนวนมาก
ดังนั้นไบต์เป็นหน่วยแอดเดรสพื้นฐานด้านล่างซึ่งสถาปัตยกรรมคอมพิวเตอร์ไม่สามารถอยู่ และเนื่องจากไม่มี (อาจ) มีคอมพิวเตอร์ที่รองรับไบต์ 4 บิตคุณจึงไม่มี4 บิตเป็นต้น bool
อย่างไรก็ตามหากคุณสามารถออกแบบสถาปัตยกรรมดังกล่าวที่สามารถจัดการ 4 บิตเป็นหน่วยแอดเดรสพื้นฐานได้คุณจะมีbool
ขนาด 4 บิตในคอมพิวเตอร์เครื่องนั้นเท่านั้น!
int
และออกchar
จากโพสต์ของฉัน
bool
ได้เนื่องจากchar
เป็นหน่วยแอดเดรสที่เล็กที่สุดใน C ++ไม่ว่าสถาปัตยกรรมใดจะสามารถจัดการกับ opcodes ของตัวเองได้ sizeof(bool)
ต้องมีค่าอย่างน้อย 1 และbool
อ็อบเจ็กต์ที่อยู่ติดกันต้องมีแอดเดรสของตัวเองใน C ++ดังนั้นการนำไปใช้งานเพียงแค่ทำให้มันใหญ่ขึ้นและสิ้นเปลืองหน่วยความจำ นั่นเป็นเหตุผลว่าทำไมเขตข้อมูลบิตจึงมีอยู่เป็นกรณีพิเศษ: สมาชิกบิตฟิลด์ของโครงสร้างไม่จำเป็นต้องระบุแอดเดรสแยกกันดังนั้นจึงมีขนาดเล็กกว่า a ได้char
(แม้ว่าโครงสร้างทั้งหมดจะยังไม่สามารถเป็นได้)
char
เป็นหน่วยแอดเดรสที่เล็กที่สุดใน C ++ ได้ไหม
sizeof(bool)
ต้องไม่เป็น 0.5 :-) ฉันคิดว่าการใช้งานสามารถให้ตัวชี้ไบต์ย่อยเป็นส่วนขยายได้ตามกฎหมาย แต่วัตถุ "ธรรมดา" เช่นบูลที่จัดสรรด้วยวิธีธรรมดาต้องทำตามที่มาตรฐานกล่าว
คำตอบที่ง่ายที่สุดคือ เป็นเพราะ CPU ระบุหน่วยความจำเป็นไบต์ไม่ใช่บิตและการดำเนินการในระดับบิตช้ามาก
อย่างไรก็ตามสามารถใช้การจัดสรรขนาดบิตใน C ++ ได้ มี std :: vector ความเชี่ยวชาญสำหรับเวกเตอร์บิตและโครงสร้างที่รับรายการขนาดบิต
ย้อนกลับไปในสมัยก่อนที่ฉันต้องเดินไปโรงเรียนท่ามกลางพายุหิมะที่โหมกระหน่ำขึ้นเขาทั้งสองทางและอาหารกลางวันเป็นสัตว์อะไรก็ได้ที่เราสามารถตามหาในป่าหลังโรงเรียนและฆ่าด้วยมือเปล่าคอมพิวเตอร์มีหน่วยความจำน้อยกว่า ในวันนี้ คอมพิวเตอร์เครื่องแรกที่ฉันใช้มี RAM 6K ไม่ใช่ 6 เมกะไบต์ไม่ใช่ 6 กิกะไบต์ 6 กิโลไบต์ ในสภาพแวดล้อมนั้นมันสมเหตุสมผลมากที่จะแพ็คบูลีนลงใน int ให้มากที่สุดเท่าที่จะทำได้ดังนั้นเราจะใช้การดำเนินการเป็นประจำเพื่อนำมันออกและใส่เข้าไป
วันนี้เมื่อผู้คนล้อเลียนคุณว่ามี RAM เพียง 1 GB และที่เดียวที่คุณสามารถหาฮาร์ดไดรฟ์ที่มีน้อยกว่า 200 GB ได้คือที่ร้านขายของเก่ามันก็ไม่คุ้มกับปัญหาในการแพ็คบิต
คุณสามารถใช้เขตข้อมูลบิตเพื่อรับจำนวนเต็มของขนาดย่อย
struct X
{
int val:4; // 4 bit int.
};
แม้ว่าโดยปกติจะใช้เพื่อแมปโครงสร้างกับรูปแบบบิตที่คาดหวังของฮาร์ดแวร์:
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 บิตและ 4 และ 2 บิต ints แต่นั่นจะทำให้ชุดคำสั่งแปลก ๆ ที่ไม่มีประสิทธิภาพเพิ่มขึ้นเพราะเป็นวิธีที่ผิดธรรมชาติในการดูสถาปัตยกรรม มันเป็นเรื่องที่สมเหตุสมผลที่จะ "เสีย" ส่วนที่ดีกว่าของไบต์แทนที่จะพยายามเรียกคืนข้อมูลที่ไม่ได้ใช้นั้น
แอพเดียวที่รบกวนการบรรจุบูลหลายตัวลงในไบต์เดียวจากประสบการณ์ของฉันคือ Sql Server
เนื่องจากไบต์เป็นหน่วยแอดเดรสที่เล็กที่สุดในภาษา
แต่คุณสามารถทำให้บูลใช้เวลา 1 บิตได้เช่นถ้าคุณมีจำนวนมากเช่น ในโครงสร้างเช่นนี้:
struct A
{
bool a:1, b:1, c:1, d:1, e:1;
};
bool
สามารถเป็นหนึ่งไบต์ - ขนาดที่เล็กที่สุดที่สามารถระบุได้ของ CPU หรืออาจใหญ่กว่า ไม่แปลกที่จะต้องมีbool
ขนาดint
เพื่อจุดประสงค์ด้านประสิทธิภาพ หากเพื่อวัตถุประสงค์เฉพาะ (เช่นการจำลองฮาร์ดแวร์) คุณต้องการประเภทที่มี N บิตคุณสามารถค้นหาไลบรารีสำหรับสิ่งนั้นได้ (เช่นไลบรารี GBL มีBitSet<N>
คลาส) หากคุณกังวลกับขนาดของbool
(คุณอาจมีคอนเทนเนอร์ขนาดใหญ่) คุณสามารถแพ็คบิตด้วยตัวคุณเองหรือใช้std::vector<bool>
ที่จะทำเพื่อคุณ (โปรดใช้ความระมัดระวังในภายหลังเนื่องจากไม่เป็นไปตามข้อกำหนดของคอนเทนเนอร์)
ลองคิดดูว่าคุณจะนำสิ่งนี้ไปใช้ในระดับอีมูเลเตอร์ของคุณอย่างไร ...
bool a[10] = {false};
bool &rbool = a[3];
bool *pbool = a + 3;
assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);
เนื่องจากโดยทั่วไปแล้ว CPU จะจัดสรรหน่วยความจำโดยมี 1 ไบต์เป็นหน่วยพื้นฐานแม้ว่า CPU บางตัวเช่น MIPS จะใช้คำ 4 ไบต์ก็ตาม
อย่างไรก็ตามvector
ข้อตกลงbool
ในรูปแบบพิเศษโดยมีการvector<bool>
จัดสรรหนึ่งบิตสำหรับแต่ละบูล
lw
/ sw
มีการใช้กันอย่างแพร่หลายมากขึ้น
ไบต์เป็นหน่วยที่เล็กกว่าของการจัดเก็บข้อมูลดิจิทัลของคอมพิวเตอร์ ในคอมพิวเตอร์แรมมีหลายล้านไบต์และทุกคนมีที่อยู่ หากมีที่อยู่สำหรับทุกบิตคอมพิวเตอร์สามารถจัดการ RAM น้อยลง 8 เท่าสิ่งที่สามารถทำได้
ข้อมูลเพิ่มเติม: Wikipedia
แม้ว่าขนาดต่ำสุดที่เป็นไปได้คือ 1 ไบต์คุณสามารถมีข้อมูลบูลีน 8 บิตใน 1 ไบต์:
http://en.wikipedia.org/wiki/Bit_array
ตัวอย่างเช่นภาษา Julia มี BitArray และฉันอ่านเกี่ยวกับการใช้งาน C ++
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. คอมไพเลอร์ส่วนใหญ่จะจัดสรรแบบเต็มunsigned int
อย่างไรก็ตามพวกเขาจัดการกับบิตบิดด้วยตัวเองเมื่อคุณอ่าน / เขียน นอกจากนี้พวกเขาจัดการด้วยตัวเองด้วยการทำงานของโมดูโล นั่นคือunsigned small : 4
แอตทริบิวต์ที่มีค่าระหว่าง 0 ถึง 15 และเมื่อควรถึง 16 จะไม่เขียนทับบิตก่อนหน้า :)