2012-04-27 51 views
0

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

所以这里有问题。

Q1)是否有在用C

Q2)目标C等ZeroMemory任何方法是否有任何其他方式来设置nessecary字节为零,而无需使用任何循环。

在此先感谢...

P.S.可以提供一些代码,如果nessecary ...

+2

'memset'会做你想要的吗? – 2012-04-27 13:11:41

+0

感谢奥利的回应。但我无法弄清楚如何使用memset。我认为它不会做我想要的。我需要这样的东西:'setZero:rawData FromByte:0 ToByte:someByte' – Garnik 2012-04-27 14:34:35

+0

嗯,认为'memset'将帮助...这是唯一的方法... – Garnik 2012-04-30 08:37:46

回答

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]); 

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

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

+0

嗯...首先我不知道为什么,也许它应该是这样的,但我的'rawData'的大小(我初始化它像这样'unsigned char * rawData =(unsigned char *)calloc(gridSize * gridSize,sizeof(unsigned char));')总是4,I认为它返回4字节。第二件事我可以有我的缓冲区(rawData)没有任何strlen的大小。第三个问题,对不起,但我不明白你的代码。 :( – Garnik 2012-04-27 14:30:47

相关问题