Влияет ли порядок постоянного операнда с любым арифметическим оператором на оптимизацию? - PullRequest
3 голосов
/ 26 июня 2019

Предположим, мы определили const или constexpr, и мы несколько раз выполняем простой арифметический оператор, а также переменные и вызовы функций не будут выражать или возвращать константы .

    #define NU = 3; //Macro or
    const int NU = 3 // general declaration or constexpr
    auto NU = []()constexpr -> int { return 3;}
    int result = 0;

   #Approach one -> const NU on left side of the operator right side could be function call or a function parameter
    for(int i = 0; i< SOME_MAX; ++i) result = NU * foo(); // function call or
    for(int i = 0; i< SOME_MAX; ++i) result = NU * var; // variable

   #Approach two -> const NU on Right side of the operator Left side could be function call or a function parameter
    for(int i = 0; i< SOME_MAX; ++i) result = foo() * NU ;// function call or
    for(int i = 0; i< SOME_MAX; ++i) result = var * NU; // variable

Какой подход будет генерировать оптимизированную сборку -> машинный код?

Будет ли постоянный операнд на LHS или RHS относительно арифметического оператора влиять на оптимизацию или производительность ?

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

Спасибо.

1 Ответ

6 голосов
/ 26 июня 2019

должно быть так же. Большинство современных компиляторов будут оценивать и распространять константы во время компиляции. Теория называется постоянное свертывание или постоянное распространение.

РЕДАКТИРОВАТЬ: с точки зрения какой стороны, он не должен быть другим. Хотя, я думаю, что в доказательствах теорем, таких как coq, доказать оптимизацию RHS труднее, чем оптимизацию LHS (или, может быть, наоборот ... я забыл).

...