C OR 没有循环的大块内存

Posted

技术标签:

【中文标题】C OR 没有循环的大块内存【英文标题】:C OR large block of memory without loop 【发布时间】:2012-07-30 02:37:46 【问题描述】:

我有一个看起来像这样的函数void doSomething(unsigned char buff[50]); 我想在我的函数中做的是快速确定buff是否全部为空。

为此,我想我可以按位 缓冲区并检查结果是否为零,因为任何 on 字节都会导致按位 或 为 1。结果为零表示数组中的所有字节都为零。

在 C 中是否有一种简单的方法可以在不循环整个缓冲区的情况下做到这一点? 如果是跨平台就好了。

【问题讨论】:

我不太确定你在提议什么 - 你如何“按位或”缓冲区而不循环它? Faster approach to checking for an all-zero buffer in C? 的可能重复项 【参考方案1】:

没有。但是您可以通过在进行检查之前强制转换为 32 位或 64 位类型来减少迭代次数。只需确保正确处理末尾的额外 16 位即可。

【讨论】:

【参考方案2】:

不可移植,但在 x86 上,您可以使用 REP SCASB,W,D instructions 在 x86 上执行此操作。

【讨论】:

【参考方案3】:

我认为部分答案还取决于缓冲区的长度。

如果您的缓冲区是 50 字节长(也就是说,如果它很短并且在编译时知道它的长度),是的,按位 OR(和转换,正如 Ignacio 在另一个答案中所说)似乎是正确的解决方案。

否则,我会以老式方式对循环进行编码(即测试每个字节是否为零)并让编译器优化为我展开循环。

【讨论】:

以上是关于C OR 没有循环的大块内存的主要内容,如果未能解决你的问题,请参考以下文章

新时代内存分配器:TCMalloc

新时代内存分配器:TCMalloc

新时代内存分配器:TCMalloc

新时代内存分配器:TCMalloc

如何正确统计C程序运行的内存占用量?

内存管理算法--Buddy伙伴算法