std::bitset<N> 实现导致大小被窃听

问题描述

现在看来 std::bitset<N>一个 unsigned longs 数组,这意味着当 N 小时会有一个(沉重的?)开销。 sizeof(std::bitset<8>)8 bytes

底层数组本身的类型不是template参数是否有原因?为什么在更合适的情况下实现不使用 uint32_t/16_t/8_t?我在实施中没有看到任何限制这一点的内容

我猜我错过了一个特定的原因,但不确定如何寻找它,或者根本没有原因?由于这是一个如此简单的 container,我无法理解 C++ 的零开销原则似乎在此处被避免。

GCC 实现:https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a00775_source.html

我相信 clang 是相似的(使用 sizeof 来确认)

解决方法

我无法理解这里似乎如何避免 C++ 的零开销原则。

零开销原则是一个原则,而不是 C++ 的绝对规则。

许多人在编译时固定容量有用的上下文中使用 std::vector。这种类型可以只有两个指针而不是三个指针,因此可以小 50%。许多人在不可变字符串即使不是更好的情况下也能正常工作的上下文中使用 std::string;它会减少字符串的大小(忽略 SSO),以及它的复杂性。等等。

这些都代表相对于标准类型的低效率。没有标准库类型可以处理所有可能的使用场景。此类类型的目标是广泛使用,而不是完美。

没有什么可以阻止某人使用具有用户提供的底层类型的完全相同的接口编写位集样式类型。但是标准没有这种类型。

确实,没有什么可以阻止 bitset实现根据给定的位数选择基础类型。您的实现没有做到这一点,但它可以做到。