Убедитесь, что вы определили NDEBUGЕдинственный способ, которым uBLAS знает, что вам нужна конфигурация релиза, - это проверить, определили ли вы NDEBUG. Если вы этого не сделаете, это предполагает, что вам нужна конфигурация отладки и добавляет много очень полезной проверки времени выполнения. Но это очень медленно!
BOOST_UBLAS_MOVE_SEMANTICS
The patch and description was provided by Nasos Iliopoulos.
Непосредственным эффектом этого варианта является устранение потребности в ноалиях в типахвекторныйиматричный, при назначении на тот же тип. Этот вариант не оказывает влияния на ограниченные и с типы. Хотя это редкость, не все компиляторы поддерживают удаление копий (что позволяет перемещать семантику), поэтому необходимо выполнить тест, чтобы убедиться, что есть преимущество при включении. Небольшая демонстрация и тест можно найти вtest_move_semantics.cpp
Впримере испытанийопределены два теста, один для векторов и один для матриц. Целью данного примера является печать указателей хранения каждого из контейнеров до и после присвоения временному объекту. При включении семантики перемещения вектори матрицаиперемещаются из временного хранилища и не выполняются никакие копии.
Если семантика движения поддерживается вашим компилятором, вы получите такой вывод, как:
matrix<double> --------------------------------------------------------------------
Temporary pointer r: 0x94790c0
Pointer (must be equal to temp. pointer if move semantics are enabled) : 0x94790c0
Примечания:
Неудивительно, что матрицы и векторы были переданы VALUE, компилятор заботится и либо движется (если основной код не изменяет объект), либо копирует (если основной код изменяет объект).
Возможно, есть некоторое пространство для некоторых улучшений (например, очистка данных перед обменом).
Семантика движения не устраняет временности. Они скорее перемещают свое хранилище, поэтому копии не выполняются.
MSVC не реализует оптимизацию обратной стоимости в режиме отладки. Так что, если вы создадите отладку с этим компилятором, вы можете получитьдругое поведение, чем сборка релиза.
Включение семантики движения осуществляется через #define BOOST_UBLAS_MOVE_SEMANTICS
Существует много возможностей для оптимизации при выходе стандарта c++0x, используя ссылки на rvalue. (У меня есть сладкая векторная реализация, использующая это).
Если вы включите семантику движения, и ваш компилятор не поддержит их, операция будет проходить мимо ссылки.
Когда BOOST_UBLAS_CHECK_ENABLE определен, то все проверки индексов и параметров включены. Это включено в режиме отладки и отключено в режиме выпуска.
BOOST_UBLAS_TYPE_CHECK
Когда включена функция BOOST_UBLAS_TYPE_CHECK, включаются все возможные дорогостоящие проверки структуры. Если это нежелательно, используйте#define Boost_UBLAS_TYPE_CHECK 0перед включением любого заголовка uBLAS. Оригинальное название: Boost_UBLAS_TYPE_CHECK_EPSILON Может использоваться для контроля приемлемого допуска, см.Detail/matrix_assign.hppдля реализации деталей этой проверки.
BOOST_UBLAS_USE_LONG_DOUBLE
Включите выражения uBLAS, которые включают контейнеры с длинным двойником "
BOOST_UBLAS_USE_INTERVAL
Включить выражения uBLAS, которые включают контейнеры типов «boost::numeric:::interval».
Configuring uBLAS with Macros
Многие макросы появляются в ublas/config.hpp и в других местах. Надеюсь, в будущем некоторые из них исчезнут. Они делятся на 4 группы:
Автоматически устанавливается на основе NDEBUG "boost/numeric/ublas/config.hpp". Делает различие между отладкой (безопасным) и выпуском (быстрым) режимом. Похожие на STLport
Режим выпуска(определяется NDEBUG)
BOOST_UBLAS_INLINEОпределение зависимых компиляторов для наложения функций управления.
BOOST_UBLAS_USE_FAST_SAME
Режим отладки
Boost_UBLAS_CHECK_ENABLEВключить проверку индексов, итераторов и параметров. Предотвращение выхода из ограниченного доступа и т.д.
BOOST_UBLAS_TYPE_CHECKВключить дополнительные проверки результатов выражений с использованием неплотных типов. Выбирает ошибку времени выполнения, такую как присвоение численно несимметричной матрицы symmertic_matrix. Используйте#define Boost_UBLAS_TYPE_CHECK 0для отключения дорогостоящих проверок численного типа.(Примечание: «проверка структуры» была бы гораздо лучшим названием.)
BOOST_UBLAS_TYPE_CHECK_EPSILONпо умолчанию: sqrt(epsilon), контролирует, насколько большой может стать разница между ожидаемым результатом и вычисленным результатом. Увеличьте это значение, если вы собираетесь использовать сингулярные или плохо масштабированные матрицы. Пожалуйста, обратитесь кDetail/matrix_assign.hppдля осуществления этих проверок типа.
Автоматически устанавливается по принципу «boost/numeric/ublas/config.hpp» на основе компилятора и макроса boost/config.hpp. Увеличивает обходные пути дефицита компилятора, уже поставляемые boost/config.hpp
BOOST_UBLAS_NO_NESTED_CLASS_RELATIONОсобенно неприятная проблема с VC7.1 требует, чтобы uBLAS и использование пользователем начинались (это), а не начинались.
BOOST_UBLAS_NO_SMART_PROXIESОтключить автоматическое распространение «постоянства» на прокси. Умные прокси автоматически определяют, является ли контейнер, на который они ссылаются, постоянным или нет. Они корректируют определение итераторов и контейнерного доступа, чтобы отразить эту константу.
Для использования авторами uBLAS для тестирования методов реализации. Набор в config.hpp
Boost_UBLAS_USE_INVARIANT_HOISTING
BOOST_UBLAS_USE_INDEXING
BOOST_UBLAS_USE_INDEXED_ITERATOR
BOOST_UBLAS_NON_CONFORMANT_PROXIESГэппи-контейнеры могут быть несоответствующими, то есть содержать элементы с разными индексами. Назначение между прокси-серверами (например, векторными диапазонами) этих контейнеров затруднено, поскольку LHS может потребоваться вставить новые элементы. Это медленно.
BOOST_UBLAS_USE_DUFF_DEVICEПочти бесполезно на всех платформах (см. GCC's -funroll-loops)
Варианты пользователей. Может быть предварительно определен пользователем перед включением любых заголовков uBLAS. Они также могут быть автоматически определены для некоторых компиляторов для работы с ошибками компиляции.
Boost_UBLAS_USE_LONG_DOUBLEВключить выражения uBLAS, которые включают контейнеры «длинного двойника»
BOOST_UBLAS_USE_INTERVALВключить выражения uBLAS, включающие контейнеры типов «boost::numeric:::interval»
BOOST_UBLAS_SIMPLE_ET_DEBUGДля упрощения отладки можно упростить шаблон выражения, поэтому они ограничены одной операцией
BOOST_UBLAS_ENABLE_PROXY_SHORTCUTSвключить автоматическое преобразование из класса прокси в выражение матрицы
BOOST_UBLAS_NO_ELEMENT_PROXIESОтключает использование прокси-элементов для типов gappy.
Последнее изменение: Wed 16 23:16:45 CEST 2009
Last modified: Wed Sep 16 23:16:45 CEST 2009
[ORIG_END] -->
Статья Boost Basic Linear Algebra - Configuration Options раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.