如果一个数组全为 0(或 false),我可以在 C(++) 中检查而不迭代/循环每个单个值并且不分配相同大小的新数组(使用memcmp
)吗?
我滥用布尔数组在运行时拥有任意大的位集并对其进行一些位翻转
您可以使用以下条件:
(myvector.end() == std::find(myvector.begin(), myvector.end(), true))
显然,在内部,这会遍历所有值。
另一种选择(实际上应该避免循环)是覆盖所有写访问函数,并跟踪是否true
曾经被写入你的向量。
更新
Lie Ryan 在下面的评论中描述了一种基于相同原理的更稳健的方法。
如果没有排序,没有。你打算如何实现这一目标?您需要检查每个元素以查看它是否为 0!当然,memcmp 也会检查每个元素。因为它还要读取另一个数组,所以它会贵得多。
当然,您可以在遇到非 0 元素时尽早退出。
您唯一的选择是使用 SIMD(它在技术上仍然检查每个元素,但使用较少的指令),但您通常不会在通用数组中这样做。
(顺便说一句,我的回答假设您有一个简单的静态 C/C++ 数组。如果您可以指定您拥有的数组类型,我们可以更具体。)
如果您知道这将是一项要求,您可以构建一个由数组(可能是动态的)和一个计数或当前非零单元格组成的数据结构。显然单元格的设置必须通过抽象,但这在 c++ 中很自然,有重载,你可以在 c 中使用不透明类型。
考虑boost::dynamic_bitset
改用。它有一个none
成员和几个其他类似std::bitset
的操作,但它的长度可以在运行时设置。
假设您有一个包含 N 个元素的数组,您可以对一组基向量进行一些检查。
例如,您有一个要测试的 15 元素数组。
您可以针对 8 元素零数组、4 元素零数组、2 元素零数组和 1 元素零数组对其进行测试。
只要知道要测试的数组的最大大小,就只需分配这些元素。此外,测试可以并行进行(如果需要,还可以使用内部组装)。
仅使用 8 元素数组即可进一步改进内存分配,因为 4 元素零数组只是 8 元素零数组的前半部分。
不,您可以将数组与 进行比较memcmp
,但不能将一个值与一块内存进行比较。
您可以做的是在 C++ 中使用算法,但这仍然涉及内部循环。
您不必遍历整个事物,只需停止循环第一个非零值即可。
除了依次检查它们之外,我想不出任何方法来检查一组值 - 你可以通过检查底层内存来玩游戏,因为它大于bool
(__int64
比如说)但是对齐是一个问题。
编辑:您可以保留单独的设置位计数,并检查它是否非零。你必须小心维护这个,所以设置一个位没有++
它等等。
针织,
我不认为您可以访问目标计算机上的一些花哨的 DMA 硬件?有时 DMA 硬件完全支持您需要的操作,即“此内存区域是否全为零?” 在处理大型位缓冲区时,这种硬件加速比较是一种常见的解决方案。例如,一些 RAID 控制器使用这种机制进行奇偶校验。