引擎盖下的std::bitset<N>
现在似乎是unsigned longs
的数组,这意味着当N很小时会有(重?(开销。sizeof(std::bitset<8>)
就是8 bytes
!
为什么底层数组的类型本身不是template
参数?为什么在更合适的情况下实现不使用uint32_t/16_t/8_t
?在实施过程中,我没有看到任何限制这一点的东西?
我猜我错过了一个特定的原因,但不确定如何寻找它,或者可能根本没有原因?由于这是一个如此简单的container
,我无法理解如何在这里避免C++
的零开销原理。
GCC Impl:https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a0775_source.html
我相信clang是类似的(使用的尺寸确认(
我不明白C++的零开销原理在这里是如何避免的。
零开销原理是原理,而不是C++的绝对规则。
许多人在编译时固定容量有用的情况下使用std::vector
。这样的类型可以只有两个指针而不是三个,因此可以小50%。许多人在不可变字符串即使不更好也同样有效的情况下使用std::string
;它将减少字符串的大小(忽略SSO(及其复杂性。等等
这些都表示相对于标准类型而言效率低下。没有一种标准的库类型能够处理所有可能的使用场景。这种类型的目标是广泛有用,而不是完美。
没有什么可以阻止某人使用与用户提供的底层类型完全相同的接口编写位集样式类型。但该标准没有这样的类型。
事实上,没有什么可以阻止bitset
的实现根据给定的位数选择底层类型。您的实现不能做到这一点,但它可以做到。