0

我正在开发一个应该使用很少资源并且速度非常快的应用程序。在我的应用程序中,我使用了一个unsigned char* rawData包含从图像中获取的字节。所以在这个rawData数组中我必须保持一些字节和其他设置为零。但是我不允许使用任何循环(否则我可以遍历每个字节并将它们设置为零)。

所以这里有问题。

Q1)Objective C中有没有像C中一样ZeroMemory的方法

Q2)是否有任何其他方法可以在不使用任何循环的情况下将必要字节设置为零。

提前致谢...

PS 如果需要可以提供一些代码...

4

1 回答 1

2

如果您不知道缓冲区的大小,那么没有循环就无法做到。即使您自己不编写循环,调用类似 strlen 的东西也会导致循环。我在这里也将递归视为一个循环。

您如何知道要保留哪些字节以及将哪些设置为零?如果这些字节位于已知位置,则可以使用向量操作将一些字节清零,而不是其他字节。以下示例仅将 的前 64 个字节中的偶数字节清零rawData

__m128i zeros = _mm_setzero_si128();
uint8_t mask[] = {8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0};
__m128i sse_mask = _mm_load_si128(mask);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[0]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[16]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[32]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[48]);

如果 in 每个字节的高位mask为 1,则 in 对应的值zeros将被复制到rawData. 您可以使用这些掩码副本的序列来快速替换某些字节而不是其他字节。生成的机器代码使用 SSE 操作,因此这实际上非常快。rawData这不是必需的,但如果是 16 字节对齐,SSE 操作将运行得更快。

对不起,如果你的目标是 ARM。我相信 NEON 内在函数是相似的,但并不完全相同。

于 2012-04-27T13:44:17.940 回答