如何解决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
的实现根据给定的位数选择基础类型。您的实现没有做到这一点,但它可以做到。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。