2010-02-10 37 views

Trả lời

20
struct record { 
    char *name; 
    int refcount : 4; 
    unsigned dirty : 1; 
}; 

Đó là các trường bit; số lượng cho biết kích thước chính xác của trường, tính theo bit. Các trường bit có thể được sử dụng để tiết kiệm không gian trong các cấu trúc có một số cờ nhị phân hoặc các trường nhỏ khác và chúng cũng có thể được sử dụng trong một nỗ lực để phù hợp với bố trí lưu trữ được áp đặt bên ngoài. (Thành công của họ ở nhiệm vụ thứ hai được giảm nhẹ bởi thực tế là các trường bit được gán trái sang phải trên một số máy và từ phải sang trái trên các máy khác).

Lưu ý rằng ký hiệu dấu hai chấm để xác định kích cỡ của một trường theo bit chỉ hợp lệ trong cấu trúc (và trong công đoàn); bạn không thể sử dụng cơ chế này để chỉ định kích thước của các biến tùy ý.

  • Tham chiếu: K & R1 Sec. 6.7 pp. 136-8
  • K & R2 Sec. 6.9 Trang 149-50
  • ISO Sec. 6.5.2.1
  • H & S Sec. 5.6.5 pp. 136-8
4

Điều này có nghĩa là start có chiều rộng 1 bit, trái ngược với thông thường bool dài 1 byte. Bạn có thể đóng gói nhiều biến nhỏ hơn thành một biến lớn hơn và trình biên dịch sẽ tạo ra tất cả và/hoặc mã cần thiết để đọc/ghi nó cho bạn. Bạn sẽ có một hit hiệu suất (đáng chú ý), nhưng, nếu được sử dụng đúng, bạn sẽ sử dụng ít bộ nhớ hơn rất nhiều.

+0

Hiệu suất của cái gì? Tôi cho rằng quá trình biên dịch bị chậm lại (không nên là vấn đề gì), nhưng hiệu năng thời gian chạy có bị chậm lại không? – Oxymoron

+0

Có, khi chạy, mọi truy cập bạn thực hiện đối với các biến này (đọc hoặc ghi) phải được dịch sang các truy cập cấp bit. Ví dụ nếu bạn đọc một trong những điều này, trước tiên bạn phải tải trường lớn trong thanh ghi, VÀ nó với một mặt nạ và sau đó dịch chuyển sang phải, chậm hơn ít nhất 3 lần so với đọc thông thường. Cùng đi cho viết. – Blindy

+0

Nó thậm chí còn tồi tệ hơn với các trường bit xuyên biên giới, chúng phải được kết hợp, tăng gấp đôi số lượng công việc (nếu chúng không hoàn toàn bị bỏ qua). – Blindy

3

Nó làm cho thành viên start thành một trường bit, với 1 chút không gian dành riêng.

Chỉ hợp lệ cho cấu trúc/thành viên lớp, bạn không thể có biến số trường bit.

4

Xem mục nhập Wikipedia về Bit Fields. Nó cho trình biên dịch biết bao nhiêu bit cấu trúc thành viên nên chiếm.

2

Đây là cú pháp cho bit fields

Về cơ bản, bạn định nghĩa một lĩnh vực trong một cấu trúc chỉ có một vài bit của một byte đầy đủ hoặc ngắn hoặc int.
Một số trường bit có thể chia sẻ cùng một int để phương pháp này có thể được sử dụng như một cách thông minh để tránh một số thao tác bit trong việc xây dựng các giá trị.

1

Đó là bit-field. Nhưng tôi đã không bao giờ cố gắng làm bit-lĩnh vực trên boolean.

2

Đây là cú pháp để mô tả bit fields. Đây là cách đóng gói thêm thông tin vào dung lượng lưu trữ nhỏ hơn. Trong khi bình thường một bool sẽ mất ít nhất một byte (có lẽ nhiều hơn) để đại diện, bằng cách sử dụng các lĩnh vực bit, bạn có thể kết hợp một số bools vào một byte với một cú pháp đơn giản.

Hãy cẩn thận. Là một trong những khu vực ít được biết đến của ngôn ngữ, bạn có thể gặp phải các trường hợp góc khi sử dụng chúng.Ví dụ, các cấu trúc dữ liệu do đó được tạo ra có thể không di chuyển giữa các loại bộ vi xử lý.

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