Tôi vừa thấy một đoạn mã với một đoạn cú pháp mà tôi chưa từng thấy trước đây. bool start : 1;
có nghĩa là gì? Tôi tìm thấy nó bên trong một định nghĩa lớp trong một tập tin tiêu đề.Câu hỏi cú pháp C++ đơn giản về dấu hai chấm
Trả lời
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
đó là một bitfield. : 1 nghĩa là một bit được sử dụng. xem ví dụ http://msdn.microsoft.com/en-us/library/ewwyfdbe(VS.71).aspx
Đ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.
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.
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.
Đâ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ị.
Đó là bit-field. Nhưng tôi đã không bao giờ cố gắng làm bit-lĩnh vực trên boolean.
Đâ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ý.
- 1. Câu hỏi cú pháp PHP: Dấu chấm hỏi và dấu hai chấm nghĩa là gì?
- 2. Câu hỏi cú pháp ngày Oracle SQL đơn giản
- 3. Câu hỏi đơn giản về java SimpleDateFormat
- 4. Câu hỏi LINQ đơn giản trong C#
- 5. C# NẾU đơn giản HOẶC câu hỏi
- 6. dấu gạch ngang hai dấu chấm phẩy (;;) cú pháp
- 7. câu hỏi lừa về cú pháp khai báo trong C++
- 8. Dấu chấm hỏi và dấu hai chấm trong câu? nó có nghĩa là gì?
- 9. Câu hỏi đơn giản về tuple of scala
- 10. câu hỏi thiết kế bảng đơn giản
- 11. (đơn giản) tăng thread_group câu hỏi
- 12. Xcode. Câu hỏi về kiểm tra lỗi cú pháp
- 13. Cú pháp dấu ba chấm la bàn
- 14. Câu hỏi đơn giản: Những phản ánh trong C#
- 15. Câu hỏi định dạng WPF đơn giản
- 16. Câu hỏi Regex rất đơn giản
- 17. Câu hỏi LINQ đơn giản: Cách chọn nhiều cột?
- 18. Câu hỏi về C bitfields
- 19. Erlang: Cú pháp chấm hỏi có nghĩa là gì?
- 20. Ant: Hai câu hỏi về dirsets
- 21. Cú pháp Objective-C này là gì, ký hiệu chấm chấm kiểu dấu chấm? "..."
- 22. attr_reader với dấu chấm hỏi trong tên
- 23. Câu hỏi về phương pháp [Tinh khiết]
- 24. Bảng SQL Lite đơn giản/câu hỏi nhập
- 25. Một C XML đơn giản phân tích cú pháp
- 26. Câu hỏi về không gian tên C#
- 27. Đảo ngược một chuỗi (câu hỏi đơn giản)
- 28. Generics và dấu chấm hỏi
- 29. Một số câu hỏi XNA/HLSL đơn giản
- 30. android: LinearLayout đơn giản và fill_parent câu hỏi
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
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
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