Насколько я понимаю, обертки повышенной точности Boost будут автоматически принимать такие выражения, как c = a+b
, и превращать их в mpz_add(c, a, b)
. Будет ли Boost автоматически выполнять оптимизацию, такую как преобразование умножения на степень 2 в сдвиги влево / вправо или другие подобные изменения?
1 ответ
Boost.Multiprecision выполняет ряд расширенных оптимизаций, в основном для минимизации количества временных переменных. Например, он изменит порядок a=(b*c)*a
на a*=c; a*=b
. Однако (в настоящее время, август 2014 г.) он не использует преимущества gcc __builtin_constant_p
для дальнейшей оптимизации. gmpxx
(официальная оболочка, распространяемая вместе с GMP), с другой стороны, заменит a=b*8
на a=b<<3
. Обратите внимание, что без __builtin_constant_p
было бы плохой идеей (в общей оболочке) проверять, является ли число степенью 2 перед умножением: если бы это было целесообразно, mpz_mul_ui
уже сделал бы это.
Кроме того, когда я в последний раз проверял, другие компиляторы (clang, intel, oracle) имели лишь минимальную поддержку для __builtin_constant_p
и не могли воспользоваться преимуществами его использования в gmpxx
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
*8
на<<3
. Однакоgmpxx
(официальная оболочка, поставляемая с GMP) работает с компиляторами gcc (и совместимыми).