Предпочтительный способ сравнить структуру с нулем - PullRequest
10 голосов
/ 23 января 2012

Сегодня я столкнулся с ситуацией, когда мне нужно было решить, является ли вся структура, состоящая примерно из 40 элементов, нулевой - это означает, что каждый из элементов равен нулю.
Когда думаешь, как сделать это так быстро и эффективно, каквозможно, я подумал о 3 разных способах сделать это:

  1. сравнить каждый элемент с нулем, получив 40 операторов if.
  2. выделение аналогичной структуры, которая уже обнулена и memcmpэто со структурой.
  3. , оборачивающей структуру в объединение с типом, достаточно большим, чтобы покрыть все это.

, например

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

, а затемсравнивая его с нулем.

Мне бы хотелось узнать, что вы думаете об этих решениях, какое из них вы считаете самым быстрым и наиболее эффективным.
И если вы считаете, что подход лучше, скажите мне...
Спасибо.

Ответы [ 3 ]

16 голосов
/ 23 января 2012

Сравните каждый элемент структуры с 0.

Это единственный безопасный способ сравнения двух структурных объектов (даже если для одного из структурных объектов все члены имеют значение 0). Не используйте memcmp для сравнения структуры, значение байтов заполнения в структуре не указано. Также обратите внимание, что нельзя использовать оператор == с операндами объектов структуры.

См. Ссылку c-faq на сравнение объектов структуры:

В: Есть ли способ автоматического сравнения структур?

1 голос
/ 23 января 2012

Если размер вашей структуры <= размер слова процессора, вы можете сделать трюк с объединением, однако, любой хороший компилятор должен делать это автоматически, то есть он сжимает <code>if, обеспечивая ясность, но все же поддержание производительности до нуля.

0 голосов
/ 23 января 2012

Для ясности кода, и, как уже отмечали другие, чтобы избежать проблем, вызванных заполнением, лучше всего проверить каждый элемент.

Для скорости начните с чего-то вроде этого, который просто проверяет каждый байт, чтобы увидеть,это ноль.

int iszero(void * ptr, int bytes )
{
   char * bptr = (char*)ptr;
   while( bytes-- )
     if( *bptr++ )
         return 0;
  return 1;
}

Затем оптимизируйте для сравнения слов.Посмотрите, как newlib использует такие вещи, как strlen() & memcpy(), чтобы узнать, как это сделать.

...