2011-11-01 16 views
6

kiểm tra bool;Biến bool type được lưu trong bộ nhớ như thế nào? (C++)

sizeof(test) = 1 nếu sử dụng VS 2010. Vì mọi loại dữ liệu C++ phải là địa chỉ, biến bool "thử nghiệm" là 8 bit (1 byte).

Câu hỏi của tôi là biến "test" thực sự chiếm 1 byte trong bộ nhớ?

Có kỹ năng triển khai nào có thể làm cho kiểu dữ liệu bool chỉ chiếm một chút không? Nếu có, bạn có thể cho tôi một ví dụ không?

bool test1[32] (trong VS 2010), int test2 (trong VS 2010)

Do test1test2 chiếm bộ nhớ giống nhau không?

+0

Hãy để tôi nhấn mạnh rằng nó có thể là hợp lý cho một nền tảng để lưu trữ một boolean trong 4 byte trên 32 máy bit khi siêu tối ưu hóa cho tốc độ. Sau đó, nếu bạn có 4 boolean trong một cấu trúc, bạn chỉ cần một hoạt động ALU duy nhất để kiểm tra nếu một bool là true, so với hai khi có nhiều boolean được đóng gói trong một từ máy. (Ofc sự khác biệt nhỏ như vậy thường không quan trọng chút nào.) – Kos

+0

Một số bộ xử lý nhúng thực sự có bộ nhớ địa chỉ bit, do đó biến bool có thể chiếm một bit. –

Trả lời

8

Mọi thành phần của test1 phải là địa chỉ. Điều này ngụ ý rằng test1 mất ít nhất 32 byte (và không phải bit).

Nếu bạn muốn nhiều giá trị boolean được lưu trữ trong một biến, sử dụng std::bitset hoặc std::vector<bool> (nhưng lưu ý rằng sau này không thực sự là một vectơ của bools, nó là một chuyên môn được thiết kế để tiết kiệm không gian).

IIRC, C++ 11 cũng định nghĩa std::dynamic_bitset.

+3

bạn có thể có nghĩa là 32 bit, không phải byte – Milan

+1

Nếu bộ xử lý có các đơn vị địa chỉ 8 bit, điều đó có nghĩa là 'bool' phải chiếm 1 octect (byte), không phải 4 (32 bit). Và có, vẫn còn 8-bit địa chỉ hệ thống ra khỏi đó. ARM9 có thể truy cập các giá trị 8 hoặc 32 bit. –

+2

@ entity64: 'test1' là một mảng của 32 đối tượng' bool' có thể định địa chỉ, sẽ cần (ít nhất) 32 byte, một byte cho mỗi đối tượng. –

3

Câu hỏi của tôi là biến "test" thực sự chiếm 1 byte trong bộ nhớ?

Có, nếu sizeof(bool)==1. Về cơ bản, kích thước bool được thực hiện xác định, có nghĩa là nó có thể lớn hơn 1 byte cho trình biên dịch nhất định.

bool test1 [32] (trong VS 2010), int test2 (trong VS 2010)
test1 Liệu và test2 chiếm bộ nhớ giống nhau không?

Điều gì mỗi người trong số họ chiếm được có thể được biết bằng cách sử dụng toán tử sizeof. Đó là những gì mà toán tử sizeof dành cho. Vì vậy, test1test2 sẽ chiếm lần lượt sizeof(test1)sizeof(test2)byte.

2

Một khả năng để có một biến trong tổng số 1 chút, là để đưa vào một struct bitfield:

struct { 
    int a:1; 
    int b:1; 
}; 
+0

không được là 'unsigned a: 1'? – Xeo

+0

Vâng, tôi chắc chắn rằng tôi đã sử dụng nó theo cách này, mặc dù tôi chưa bao giờ coi nó như là một số nguyên có dấu 1 bit, vì vậy bạn có một điểm ở đây. –

Các vấn đề liên quan