Tôi cần thực hiện kích thước tối thiểu của một loạt các bool. Kích thước của mảng được biết tại thời gian biên dịch.Thực hiện kích thước tối thiểu đối với mảng bool
Tôi đã kiểm tra std::bitset
và boost::array
, nhưng cả hai đều phải chịu chi phí cao cho các mảng nhỏ. Ví dụ: nếu kích thước mảng là , vùng chứa chỉ nên sử dụng 1 byte bộ nhớ (giả sử kiến trúc CPU chung).
Điều này có tồn tại hay tôi cần phải cuộn của riêng mình?
EDIT: Đây là lần triển khai cuối cùng của tôi dựa trên bài đăng của Tom Knapen. Tôi đã thêm giá trị mặc định cho hàm tạo và thêm vào trường hợp chỉ số vượt quá giới hạn. Rất cám ơn Tom và mọi người khác.
#include <stdexcept>
#include <climits>
/// Minimum size container for bool-arrays
/**
* TODO: may want to add to_uint32_t accessor and the like
* for sufficently small arrays
*/
template<int SIZE>
class bitarray
{
public:
bitarray(bool initial_value = false);
bool get(int index) const;
void set(int index, bool value);
private:
static const int ARRAY_SIZE = (SIZE + CHAR_BIT - 1)/8;
unsigned char mBits[ARRAY_SIZE];
};
// ----------------------------------------------------
// Definitions
// ----------------------------------------------------
template<int SIZE>
inline bitarray<SIZE>::bitarray(bool initial_value)
{
for(int i = 0; i < ARRAY_SIZE; ++i)
mBits[i] = initial_value ? -1 : 0;
}
template<int SIZE>
inline bool bitarray<SIZE>::get(int index) const
{
if (index >= SIZE)
throw std::out_of_range("index out of range");
return (mBits[index/CHAR_BIT] & (1 << (index % CHAR_BIT)));
}
template<int SIZE>
inline void bitarray<SIZE>::set(int index, bool value)
{
if (index >= SIZE)
throw std::out_of_range("index out of range");
if (value)
mBits[index/CHAR_BIT] |= (1 << (index % CHAR_BIT));
else
mBits[index/CHAR_BIT] &= ~(1 << (index % CHAR_BIT));
}
'std: bitset' chỉ nên sử dụng một bit cho mỗi phần tử (là 'std :: vector' làm trong một số triển khai). Làm cách nào bạn kiểm tra xem nó có sử dụng nhiều hơn không? –
@ FrédéricHamidi nếu bạn làm 'sizeof (std :: vector)' nó trả về 40 –
@ Frédéric Hamidi: Sử dụng toán tử sizeof. Đây là một phần của quá trình triển khai, nó sử dụng phân bổ động: \t _WordT * _M_wp; \t size_t _M_bpos; Có thể khác nhau cho việc triển khai std khác –