Why do I get compiler errors when passing a number
to a template function?
Скорее всего, вы на самом деле передаете тип шаблона выражения функции, и шаблон-аргумент-дедукция выводит «неправильный» тип. Попробуйте отбросить аргументы, связанные с выражениями, на фактический тип числа или в качестве последнего средства отключить поддержку шаблона выражения в типе числа, который вы используете.
When is expression template support a performance gain?
Как правило, поддержка шаблонов экспрессии добавляет небольшие накладные расходы на время выполнения, создавая и распаковывая шаблоны экспрессии, но значительно сокращает количество созданных времен. Так что наиболее эффективно в улучшении производительности, когда стоимость создания временного высока: например, при создании временного предполагает выделение памяти. Это наименее эффективно (и даже может быть неоптимизацией), когда временные параметры дешевы: например, если тип числа в основном представляет собой тонкую обертку вокруг нативного арифметического типа. Кроме того, поскольку библиотека широко использует функции тонкой встроенной обертки, оптимизация компилятора имеет важное значение для достижения высокой производительности.
Do expression templates reorder operations?
Да, они делают это, иногда довольно радикально, поэтому, если это вызывает беспокойство, их следует отключить для типа номера, который вы используете.
I can't construct my number type from some other type,
but the docs indicate that the conversion should be allowed, what's up?
Некоторые преобразования являютсяявными, которые включают в себя конструкцию из строки или конструкцию из любого типа, которая может привести к потере точности (например, конструирование целого типа из поплавка).
Why do I get an exception thrown (or the program crash due to an
uncaught exception) when using the bitwise operators on a checked cpp_int?
Битуазные операции с отрицательными значениями (или действительно любой подписанный целочисленный тип) не определены стандартом. В результате любая попытка выполнить побитовую операцию на отрицательном проверенном целом числе приведет кstd:Ошибкакак бы отбрасывается.
Why do I get compiler errors when trying to use the complement operator?
Использование оператора комплемента на подписанных типах проблематично, поскольку результат не определен стандартом, и еще более осложняется тем фактом, что большинство расширенных целочисленных типов используют представление величины знака, а не дополнение 2, которое предпочитают большинство нативных целых типов. В результате оператор комплемента намеренно отключается для проверенныхcpp_int's. Непроверенныеcpp_int's дают тот же результат, что и тип комплемента 2, но не тот же шаблон бита.
Why can't I negate an unsigned type?
Унарный оператор отрицания намеренно отключается для неподписанных целочисленных типов, поскольку его использование почти всегда будет ошибкой программирования.
Why doesn't the library use proto?
Очень ранняя версия библиотеки действительно использовала прото, но время компиляции стало слишком медленным для библиотеки. Поскольку библиотеке требовалась лишь небольшая часть того, что может предложить прото, вместо этого использовался легкий механизм шаблона выражения. Время компиляции слишком медленное...
Why not abstract out addition/multiplication algorithms?
Это считалось непрактичным: эти алгоритмы тесно связаны с фактическим представлением данных.
Статья FAQ раздела Chapter 1. Boost.Multiprecision Roadmap может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.