Альтернативой общей формуле KerrekSB, которая гарантирует использование только одного деления, является вычисление
(n + m-1) / m
Чтобы увидеть, что оно производит то же самое,написать n = k*m + r
с 0 <= r < m
.Тогда n%m == r
, а если r == 0
, у нас есть n+m-1 = k*m + (m-1)
и (n+m-1)/m == k
, в противном случае n+m-1 = (k+1)*m + (r-1)
и (n+m-1)/m == k+1
.
Большинство современных аппаратных средств дает вам коэффициент (n/m
) в одномзарегистрируйте и остаток (n%m)
в другом, когда вы выполните целочисленное деление, так что вы можете получить обе части формулы Керрека в одном делении, и большинство компиляторов сделают это.Если компилятор не использует, но использует два деления, вычисления будут значительно медленнее, поэтому, если вычисления выполняются часто, а производительность является проблемой, вы можете обойти слабость компилятора с несколько менее очевидным кодом.
В данном случае malloc
будет
malloc(4*((n+2)/3));
Но поскольку не всем очевидно, что делает эта формула, если вы ее используете, объясните ее в комментарии, а если нетнужно использовать его, используйте более очевидный код.