2016-12-06 16 views
9

Câu hỏi này thực sự đơn giản (để hỏi), std::bitset<32> là giống như uint32_t cho bộ nhớ? Hoặc nó giống như std::array<bool, 32>?Q: Làm thế nào bitet được bên trong?

Tôi thường làm điều gì đó như:

uint32_t index : 20; 
uint32_t magic : 12; 

Vì vậy, nó giống như mã này?

std::bitset<20> index; 
std::bitset<12> magic; 

Trả lời

7
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.

+0

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. –

+0

@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. –

+0

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. –

2

Một trường bit cần một struct

struct { 
    uint32_t index : 20; 
    uint32_t magic : 12; 
} 

do đó, nó không giống nhau mà

std::bitset<20> index; 
std::bitset<12> magic; 

"Multiple adjacent bit fields are usually packed together (although this behavior is implementation-defined): ".

bạn có hai std :: bitset để chúng không thể chia sẻ cùng một bộ nhớ, vì vậy nó không giống nhau.

+0

Nếu bạn không đồng ý lý do tại sao bạn không nói lý do. Tôi mở cho lập luận của bạn. – Stargateur

+0

Tôi cho một người không hiểu những gì bạn đang cố gắng trả lời. Câu hỏi sẽ hỏi cách 'bitset' được triển khai thực hiện như thế nào và bạn bắt đầu so sánh chúng với các trường bit. Không có nơi nào tôi thấy OP hỏi về sự khác biệt giữa các trường bit và 'bitset'. – NathanOliver

+0

@NathanOliver, anh ta hỏi hai câu hỏi tôi trả lời câu hỏi thứ hai.Tôi là người duy nhất đọc tất cả câu hỏi? – Stargateur

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