У меня есть следующий вложенный цикл for:
for(k = 0; k < n; ++k) {
for(m = 0; m < n; ++m) {
/* other logic altering a */
if(a[index] != 0) count++;
}
}
где a
содержит uint32_t
, поскольку n
может быть довольно большим (но постоянным), и это единственная ветвь (помимо сравнения k
а также m
с n
), Я хотел бы оптимизировать это далеко.
Распределение ноль и ненулевое в a
можно считать равномерно случайным.
Мой первый подход был
count += a[index] & 1;
но потом count
будет увеличиваться только для всех нечетных чисел.
Кроме того: у меня также есть случай, когда a
содержит bool
но согласно C ++ Условные true
а также false
определяются как ненулевые и нулевые, которые в основном эквивалентны вышеупомянутой проблеме.
Как указано в комментариях к вопросу if(a[index] != 0) count++;
не создает ветку (в данном случае), что было несколько проверено в сборке.
Для полноты эквивалента упомянутому утверждению count += a[index] != 0;
(согласно стандарту § 4.7 [conv.integral])