Từ quan điểm logic (phi kỹ thuật), không có lợi thế.
Bất kỳ mã C / C ++ đơn giản nào cũng có thể được gói trong "cấu trúc thư viện" phù hợp. Sau khi gói như vậy, vấn đề "liệu điều này có lợi hơn thế không" trở thành một câu hỏi tranh luận.
Từ quan điểm tốc độ, C / C ++ sẽ cho phép thư viện xây dựng để tạo mã hiệu quả như mã đơn giản mà nó bọc. Điều này tuy nhiên phải tuân theo:
- Chức năng nội tuyến
- Kiểm tra thời gian biên dịch và loại bỏ kiểm tra thời gian chạy không cần thiết
- Loại bỏ mã chết
- Nhiều tối ưu hóa mã khác ...
Sử dụng loại đối số phi kỹ thuật này, bất kỳ "chức năng bị thiếu" nào cũng có thể được thêm vào bởi bất kỳ ai và do đó không được tính là bất lợi.
Tuy nhiên, các yêu cầu và giới hạn tích hợp có thể được khắc phục bằng mã bổ sung. Dưới đây, tôi lập luận rằng kích thước của std::bitset
là hằng số thời gian biên dịch, và do đó, mặc dù không được tính là bất lợi, nó vẫn là thứ ảnh hưởng đến sự lựa chọn của người dùng.
Từ quan điểm thẩm mỹ (dễ đọc, dễ bảo trì, v.v.), có một sự khác biệt.
Tuy nhiên, không rõ ràng rằng std::bitset
mã ngay lập tức chiến thắng mã C đơn giản. Người ta phải xem xét các đoạn mã lớn hơn (chứ không phải một số mẫu đồ chơi) để cho biết việc sử dụng std::bitset
có cải thiện chất lượng con người của mã nguồn hay không.
Tốc độ của thao tác bit phụ thuộc vào phong cách mã hóa. Kiểu mã hóa ảnh hưởng đến cả thao tác bit C / C ++ và cũng có thể áp dụng std::bitset
như nhau, như được giải thích sau đây.
Nếu một người viết mã sử dụng operator []
để đọc và ghi một bit tại một thời điểm, người ta sẽ phải thực hiện việc này nhiều lần nếu có nhiều hơn một bit được thao tác. Điều tương tự cũng có thể nói về mã kiểu C.
Tuy nhiên, bitset
cũng có nhà khai thác khác, chẳng hạn như operator &=
, operator <<=
vv, mà hoạt động trên toàn bộ chiều rộng của bitset. Bởi vì máy móc cơ bản thường có thể hoạt động trên 32 bit, 64 bit và đôi khi là 128 bit (với SIMD) tại một thời điểm (trong cùng một số chu kỳ CPU), mã được thiết kế để tận dụng các hoạt động đa bit như vậy có thể nhanh hơn mã thao tác bit "loopy".
Ý tưởng chung được gọi là SWAR (SIMD trong một thanh ghi) và là một chủ đề con dưới các thao tác bit.
Một số nhà cung cấp C ++ có thể triển khai bitset
giữa 64 bit và 128 bit với SIMD. Một số nhà cung cấp có thể không (nhưng cuối cùng có thể làm). Nếu có nhu cầu biết thư viện của nhà cung cấp C ++ đang làm gì, cách duy nhất là xem xét việc tháo gỡ.
Về việc std::bitset
có những hạn chế, tôi có thể đưa ra hai ví dụ.
- Kích thước của
std::bitset
phải được biết tại thời gian biên dịch. Để tạo ra một mảng các bit có kích thước được chọn động, người ta sẽ phải sử dụng std::vector<bool>
.
- Đặc tả C ++
std::bitset
hiện tại không cung cấp cách trích xuất một lát N bit liên tiếp từ một bitset
bit M lớn hơn .
Đầu tiên là cơ bản, có nghĩa là đối với những người cần các bit có kích thước động, họ phải chọn các tùy chọn khác.
Cái thứ hai có thể được khắc phục, bởi vì người ta có thể viết một số loại bộ điều hợp để thực hiện nhiệm vụ, ngay cả khi tiêu chuẩn bitset
không thể mở rộng.
Có một số loại hoạt động SWAR tiên tiến không được cung cấp ngoài hộp std::bitset
. Người ta có thể đọc về các hoạt động này trên trang web này về hoán vị bit . Như thường lệ, người ta có thể tự thực hiện những điều này, hoạt động trên đầu trang std::bitset
.
Về các cuộc thảo luận về hiệu suất.
Một lời khuyên: rất nhiều người hỏi về lý do tại sao (một cái gì đó) từ thư viện tiêu chuẩn chậm hơn nhiều so với một số mã kiểu C đơn giản. Tôi sẽ không lặp lại những kiến thức điều kiện tiên quyết của microbenchmarking ở đây, nhưng tôi chỉ có lời khuyên này: hãy chắc chắn để chuẩn trong "chế độ phát hành" (với tối ưu hóa được kích hoạt), và chắc chắn rằng mã không được loại bỏ (loại bỏ mã chết) hoặc phúc kéo ra khỏi một vòng lặp (chuyển động mã vòng lặp bất biến) .
Vì nói chung, chúng tôi không thể biết liệu ai đó (trên internet) đã thực hiện các điểm chuẩn vi mô một cách chính xác hay không, cách duy nhất chúng tôi có thể đưa ra kết luận đáng tin cậy là thực hiện các dấu hiệu vi mô của riêng mình, và ghi lại các chi tiết, và gửi đánh giá và phê bình công khai. Sẽ không hại gì khi làm lại các dấu hiệu vi mô mà những người khác đã làm trước đây.
std::bitset
được cố định tại thời gian biên dịch. Đó là nhược điểm duy nhất mà tôi có thể nghĩ ra.