将结构与零进行比较的首选方法

时间:2012-01-23 18:20:07

标签: c data-structures comparison

今天我遇到了一种情况,我需要决定一个由大约40个元素组成的整个结构是否为零 - 意味着每个元素都是零。
在思考如何尽可能快速有效地思考时,我想到了3种不同的方法:

  1. 将每个元素与零进行比较,得到40个if语句。
  2. 分配一个已经归零的类似结构,memcmp结构。
  3. 将结构包裹在一个大小足以覆盖所有类型的联合中。
  4. 例如

    typedef union {
      struct {
        uint8_t a;
        uint8_t b;
        }
      uint16_t c;
     } STRUCTURE_A;
    

    然后将其与零进行比较。

    我想知道您对这些解决方案的看法,其中您发现哪些解决方案最快,效率最高 如果你有更好的方法,请告诉我...
    感谢。

3 个答案:

答案 0 :(得分:16)

将结构的每个成员与0进行比较。

这是比较两个结构对象的唯一安全方法(即使其中一个结构对象的所有成员都设置为值0)。不要使用memcmp来比较结构,结构中填充字节的值是未指定的。另请注意,不允许将==运算符与结构对象操作数一起使用。

在结构对象比较中查看此c-faq链接:

Q: Is there a way to compare structures automatically?

答案 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()有关如何完成此操作的示例。