Câu trả lời:
Bởi vì CPU không thể giải quyết bất cứ điều gì nhỏ hơn một byte.
bt
, bts
, btr
và btc
có thể giải quyết bit duy nhất!
bt
địa chỉ một byte bù và sau đó kiểm tra bit ở một độ lệch cho trước, bất kể khi chỉ định một địa chỉ bạn đi theo byte ... bit offset bit sẽ có một chút dài dòng (xin lỗi chơi chữ).
Từ Wikipedia :
Trong lịch sử, một byte là số bit được sử dụng để mã hóa một ký tự văn bản trong máy tính và vì lý do này là yếu tố địa chỉ cơ bản trong nhiều kiến trúc máy tính.
Vì vậy, byte là các đơn vị địa chỉ cơ bản , dưới đây mà kiến trúc máy tính không thể địa chỉ. Và vì không có (có thể) tồn tại các máy tính hỗ trợ byte 4 bit, nên bạn không có 4 bit, bool
v.v.
Tuy nhiên, nếu bạn có thể thiết kế một kiến trúc như vậy có thể giải quyết 4 bit là đơn vị địa chỉ cơ bản, thì bạn sẽ chỉ có bool
kích thước 4 bit, trên máy tính đó!
int
và char
khỏi bài viết của tôi.
bool
, vì đây char
là đơn vị địa chỉ nhỏ nhất trong C ++ , bất kể kiến trúc có thể xử lý những gì với các opcode riêng của nó. sizeof(bool)
phải có giá trị ít nhất là 1 và các bool
đối tượng liền kề phải có địa chỉ riêng trong C ++ , vì vậy việc triển khai chỉ cần làm cho chúng lớn hơn và lãng phí bộ nhớ. Đó là lý do tại sao các trường bit tồn tại như một trường hợp đặc biệt: các thành viên bitfield của một cấu trúc không bắt buộc phải có địa chỉ riêng biệt, vì vậy chúng có thể nhỏ hơn một char
(mặc dù toàn bộ cấu trúc vẫn không thể).
char
là đơn vị địa chỉ nhỏ nhất trong C ++ không?
sizeof(bool)
không thể là 0,5 :-) Tôi cho rằng việc triển khai có thể cung cấp hợp pháp các con trỏ byte phụ như một phần mở rộng, nhưng các đối tượng "thông thường" như bool, được phân bổ theo cách thông thường, phải thực hiện những gì tiêu chuẩn nói.
Câu trả lời dễ nhất là; đó là vì CPU xử lý bộ nhớ theo byte chứ không phải theo bit và hoạt động theo bit rất chậm.
Tuy nhiên, có thể sử dụng phân bổ kích thước bit trong C ++. Có std :: vector chuyên môn hóa cho các vectơ bit, và cũng có các cấu trúc lấy các mục có kích thước bit.
Quay trở lại những ngày xưa khi tôi phải đi bộ đến trường trong một trận bão tuyết dữ dội, khó khăn cả hai chiều và bữa trưa là bất cứ con vật nào chúng ta có thể theo dõi trong khu rừng phía sau trường và giết chết bằng tay không, máy tính có bộ nhớ ít hơn nhiều so với hôm nay. Máy tính đầu tiên tôi từng sử dụng có 6K RAM. Không phải 6 megabyte, không phải 6 gigabyte, 6 kilobyte. Trong môi trường đó, sẽ rất có ý nghĩa khi đóng gói càng nhiều booleans vào một int như bạn có thể, và vì vậy chúng tôi sẽ thường xuyên sử dụng các hoạt động để đưa chúng ra và đưa chúng vào.
Ngày nay, khi mọi người sẽ chế giễu bạn vì chỉ có 1 GB RAM và nơi duy nhất bạn có thể tìm thấy một ổ cứng có dưới 200 GB là tại một cửa hàng đồ cổ, thật không đáng để bận tâm đến việc đóng gói bit.
Bạn có thể có các bit 1 bit và int 4 và 2 bit. Nhưng điều đó sẽ làm cho một tập lệnh kỳ lạ không tăng hiệu suất vì đó là một cách không tự nhiên để nhìn vào kiến trúc. Nó thực sự có ý nghĩa để "lãng phí" một phần tốt hơn của một byte thay vì cố gắng lấy lại dữ liệu không sử dụng.
Theo kinh nghiệm của tôi, ứng dụng duy nhất làm phiền nhiều gói thành một byte duy nhất là Sql Server.
Bạn có thể sử dụng các trường bit để lấy số nguyên có kích thước phụ.
struct X
{
int val:4; // 4 bit int.
};
Mặc dù nó thường được sử dụng để ánh xạ các cấu trúc thành các mẫu bit dự kiến phần cứng chính xác:
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
};
bool
có thể là một byte - kích thước địa chỉ nhỏ nhất của CPU hoặc có thể lớn hơn. Nó không phải là bất thường để có bool
kích thước int
cho mục đích hiệu suất. Nếu cho các mục đích cụ thể (giả sử mô phỏng phần cứng) bạn cần một loại có N bit, bạn có thể tìm một thư viện cho điều đó (ví dụ thư viện GBL có BitSet<N>
lớp). Nếu bạn quan tâm đến kích thước của bool
(bạn có thể có một thùng chứa lớn), thì bạn có thể tự đóng gói các bit hoặc sử dụng std::vector<bool>
nó sẽ giúp bạn (hãy cẩn thận với cái sau, vì nó không thỏa mãn các yêu cầu của container).
Bởi vì nói chung, CPU phân bổ bộ nhớ với 1 byte làm đơn vị cơ bản, mặc dù một số CPU như MIPS sử dụng từ 4 byte.
Tuy nhiên, vector
giao dịch bool
theo cách đặc biệt, với vector<bool>
một bit cho mỗi bool được phân bổ.
lw
/ sw
được sử dụng rộng rãi hơn nhiều.
Byte là đơn vị lưu trữ dữ liệu số nhỏ hơn của máy tính. Trong máy tính, RAM có hàng triệu byte và bất kỳ ai trong số họ cũng có địa chỉ. Nếu nó có một địa chỉ cho mỗi bit, một máy tính có thể quản lý RAM ít hơn 8 lần so với những gì nó có thể.
Thêm thông tin: Wikipedia
Ngay cả khi kích thước tối thiểu có thể là 1 Byte, bạn có thể có 8 bit thông tin boolean trên 1 Byte:
http://en.wikipedia.org/wiki/Bit_array
Ngôn ngữ Julia có BitArray chẳng hạn, và tôi đọc về việc triển khai C ++.
struct Packed { unsigned int flag1 : 1; unsigned int flag2: 1; };
. Hầu hết các trình biên dịch sẽ phân bổ đầy đủunsigned int
, tuy nhiên chúng tự xử lý việc xoay vòng bit khi bạn đọc / ghi. Ngoài ra, họ tự giải quyết với các hoạt động modulo. Đó là mộtunsigned small : 4
thuộc tính có giá trị từ 0 đến 15 và khi cần đến 16, nó sẽ không ghi đè lên bit trước đó :)