我正在使用用户定义的位数(我持有三维位数组,因此大小立方增加 - 假设不小于512位),并且需要单独翻转它们.现在,只是在计算机上,我正在使用该bool类型,因为内存不是问题.我计划将来将代码移到微控制器上,因此处理能力和内存要求可能是一个问题.不过现在,我只想要速度.
然后我std::bitset从C++ STL中找到了该对象,但我无法在运行时定义bitset的大小.然后我发现std::vector<byte>有一个特殊的初始化器将它们存储为位(而不是整个字节,或4个字节),但随后在维基百科中找到了这一部分:
标准库定义了
vector模板的特化bool.此专业化的描述表明实现应该打包元素,以便每个bool只使用 一位内存.这被普遍认为是一个错误.[...] C++标准委员会和图书馆工作组之间存在普遍共识,vector<bool>应该弃用并随后从标准库中删除,而功能将以不同的名称重新引入.
现在,你可能会看到我想要使用一个vector<bool>对象,但在阅读之后,我正在考虑使用其他东西.唯一的问题是我不知道该使用什么.我很好奇为什么他们说应该重新引入功能(尽管名称不同).
所以,我的问题是,vector<bool>对象的使用是否可以接受(因为它们是STL的一部分)?它们是C++标准的一部分吗?
如果他们的使用是不可接受的,是否有一个可接受的替代解决方案(我自己定义一个特殊的容器)?我自己也有一些想法,但我很好奇是否有人有更好的解决方案.另外,我想避免使用大型库(同样,我希望最终将此代码移植到微控制器).
union通过@ecatmur(/sf/answers/2209049671/)通过引用以下位来讨论关于类型惩罚的大部分未实现或实现定义的性质,关于标准的豁免 -布局structs具有成员类型的"公共初始序列":
C11(6.5.2.3结构和联合成员 ; 语义):
[...]如果一个联合包含几个共享一个共同初始序列的结构(见下文),并且如果联合对象当前包含这些结构中的一个,则允许检查其中任何一个的公共初始部分.完整的工会类型的声明是可见的.如果对应的成员具有一个或多个初始成员的序列的兼容类型(并且对于位字段,具有相同的宽度),则两个结构共享 共同的初始序列.
C++ 03([class.mem]/16):
如果POD-union包含两个或多个共享公共初始序列的POD结构,并且如果POD-union对象当前包含这些POD结构中的一个,则允许检查它们中的任何一个的公共初始部分.如果对应的成员具有一个或多个初始成员的序列的布局兼容类型(并且对于位字段,具有相同的宽度),则两个POD结构共享共同的初始序列.
这两个标准的其他版本有相似的语言; 从C++ 11开始,使用的术语是标准布局而不是POD.
由于不需要重新解释,这不是真正的类型惩罚,只是应用于union成员访问的名称替换.C++ 17(臭名昭着的P0137R1)的提议使得这种语言明确地使用了"访问就像其他结构成员被提名一样"的语言.
但请注意粗体 - " 在任何地方都可以看到完整类型的联合声明 " - C11中存在的条款,但在2003年,2011年或2014年的C++草案中没有任何内容(几乎完全相同,但后来的版本取代了" POD"使用新术语标准布局).在任何情况下,在union任何C++标准的相应部分中都完全没有' 类型位的可见声明.
@loop和@ Mints97,这里 - /sf/answers/1997029261/ - 显示这一行在C89中也没有出现,首先出现在C99中,然后保留在C中(尽管如此,从来没有过滤过到C++).
[剪掉 - 看我的回答]
从那以后,我的问题是:
这是什么意思?什么被归类为"可见声明"?该条款是否旨在缩小 - 或扩大 - 这种"惩罚"定义行为的背景范围?
我们是否假设C++中的这种遗漏是非常慎重的?
C++与C不同的原因是什么?C++是否只是从C89"继承"了这个,然后决定 - 或者更糟,忘记 - 与C99一起更新?
如果差异是故意的,那么 …