Подтвердить что ты не робот

В исходном коде Doom3, почему они использовали bithift для генерации числа вместо hardcoding?

Почему они это сделали:

Sys_SetPhysicalWorkMemory( 192 << 20, 1024 << 20 );   //Min = 201,326,592  Max = 1,073,741,824

Вместо этого:

Sys_SetPhysicalWorkMemory( 201326592, 1073741824 );

В статье я получил код из

4b9b3361

Ответ 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 это не распространялось на функции.