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

std*_*all 10 c comparison data-structures

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

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

例如

typedef union {
  struct {
    uint8_t a;
    uint8_t b;
    }
  uint16_t c;
 } STRUCTURE_A;
Run Code Online (Sandbox Code Playgroud)

然后将其与零进行比较.

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

oua*_*uah 16

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

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

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

问:有没有办法自动比较结构?

  • 如果您确保该结构不包含填充,则“memcmp”是安全的。虽然技术上允许实现添加任意无意义的填充,但在现实世界中,填充纯粹是为了对齐,并且正确构造的、自然对齐的结构将没有填充,除非可能在末尾。特别是,使用“intX_t”并在没有对齐间隙的情况下对它们进行排序是避免任何填充的好方法。 (2认同)