uint32_t index : 20;
uint32_t magic : 12;
Vì vậy, mã này giống với mã này?
std::bitset<20> index;
std::bitset<12> magic;
Tuyệt đối không, và nó rất quan trọng là bạn hiểu sự khác biệt.
Đầu tiên, biểu diễn nội bộ của std :: bitset <> ngừng hoạt động.
Bằng cách đó, chúng ta nên kiểm tra sự khác biệt giữa hai đoạn mã ở trên.
Trong C++ a bitfield không phải là một đối tượng rời rạc. Điều này có ý nghĩa quan trọng trong mã đa luồng. Điều này là bởi vì C++ 11 và lớn hơn đảm bảo rằng truy cập không được bảo vệ từ hai chủ đề đến hai đối tượng rời rạc là an toàn, nhưng truy cập của cùng một đối tượng không const bởi hai chủ đề nữa là một cuộc đua dữ liệu trừ khi được bảo vệ bởi một mutex .
Trong bitset
mã trên nó sẽ là đúng khi nói:
thread1: index = 10;
thread2: auto x = magic;
Bởi vì họ là những đối tượng rời rạc và do đó bảo đảm không gây ra các cuộc đua dữ liệu khi truy cập từ chủ đề khác nhau.
Trong mã bitfield điều này sẽ không an toàn. Bản cập nhật của chỉ số sẽ là một cuộc đua với việc đọc phép thuật, và đây là hành vi không xác định.
Nguồn
2016-12-06 15:01:02
Bạn nói đúng Tôi quên ý nghĩa đa luồng. Tôi biết rằng bộ nhớ chia sẻ bitfield. Sau đó, nếu tôi sẽ làm một số mã đa luồng, tôi nên xem làm thế nào mã sẽ làm việc trước khi lựa chọn giữa bitet hoặc bitfield. –
@MathieuVanNevel Lời khuyên tốt nhất tôi có thể cung cấp là tránh bitfields hoàn toàn trừ khi bạn đang ghi vào bộ nhớ ánh xạ I/O. –
Tôi sẽ cố gắng loại bỏ bitfield cho bitet anyway. Tôi hiểu tại sao alexeykuzmin0 nói có, nhưng bạn nói đúng đó không phải là câu trả lời đúng cho câu hỏi này. Không biết tại sao Stargateur lại quá chán nản. –