В исходном коде Doom3, почему они использовали bithift для генерации числа вместо hardcoding?
Почему они это сделали:
Sys_SetPhysicalWorkMemory( 192 << 20, 1024 << 20 ); //Min = 201,326,592 Max = 1,073,741,824
Вместо этого:
Sys_SetPhysicalWorkMemory( 201326592, 1073741824 );
В статье я получил код из
Ответы
Ответ 1
Чистым свойством является то, что смещение значения << 10
совпадает с его умножением на 1024 (1 KiB), а << 20
- 1024 * 1024, (1 MiB).
Смена последовательных степеней 10 дает все наши стандартные единицы хранения компьютеров:
Таким образом, эта функция выражает свои аргументы Sys_SetPhysicalWorkMemory
(int minBytes, int maxBytes)
как 192 МБ (мин) и 1024 МБ (макс.).
Ответ 2
Код комментария:
192 < 20 означает 192 * 2 ^ 20 = 192 * 2 ^ 10 * 2 ^ 10 = 192 * 1024 * 1024 = 192 МБайт
1024 < 20 означает 1024 * 2 ^ 20 = 1 GByte
Вычисления по константам оптимизируются, поэтому ничего не теряется.
Ответ 3
Возможно, я ошибаюсь (и я не изучал источник), но я думаю, что это просто для удобства чтения.
Ответ 4
Я думаю, что точка (еще не упомянутая) заключается в том, что
Все, кроме самых основных компиляторов, будут выполнять сдвиг во время компиляции. Всякий раз, когда вы используете операторов с постоянными выражениями, компилятор сможет сделать это до того, как код будет сгенерирован. Обратите внимание, что до constexpr и С++ 11 это не распространялось на функции.