今天我遇到了一种情况,我需要决定一个由大约40个元素组成的整个结构是否为零 - 意味着每个元素都是零。
在思考如何尽可能快速有效地思考时,我想到了3种不同的方法:
memcmp
结构。
typedef union {
struct {
uint8_t a;
uint8_t b;
}
uint16_t c;
} STRUCTURE_A;
然后将其与零进行比较。
我想知道您对这些解决方案的看法,其中您发现哪些解决方案最快,效率最高
如果你有更好的方法,请告诉我...
感谢。
答案 0 :(得分:16)
将结构的每个成员与0进行比较。
这是比较两个结构对象的唯一安全方法(即使其中一个结构对象的所有成员都设置为值0)。不要使用memcmp
来比较结构,结构中填充字节的值是未指定的。另请注意,不允许将==
运算符与结构对象操作数一起使用。
在结构对象比较中查看此c-faq链接:
答案 1 :(得分:1)
如果你的结构大小是< =处理器的字大小,你可以做你的联合技巧,但是,任何好的编译器都应该自动执行此操作,也就是说它会压缩if
,允许清晰但仍能保持性能达到最佳状态。
答案 2 :(得分:0)
为了代码清晰,并且正如其他人所指出的那样,为了避免填充引起的问题,检查每个成员是最好的。
对于速度,从这样的事情开始,只检查每个字节以查看它是否为零。
int iszero(void * ptr, int bytes )
{
char * bptr = (char*)ptr;
while( bytes-- )
if( *bptr++ )
return 0;
return 1;
}
然后优化以进行单词对齐比较。查看newlib对strlen()
& memcpy()
有关如何完成此操作的示例。