![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Practical considerationsBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 18. Boost.Lambda
|
expression | lambda expression | hand-coded function object |
---|---|---|
x | 240 | 230 |
x | 340 | 350 |
x | 770 | 760 |
x | 1180 | 1210 |
x | 1950 год | 1910 год |
Table 18.4. Test 2
compose2
, bind1st
etc.) and as traditional hand-coded function object classes.
Using BLL terminology,
a
and b
are bound arguments in the expressions, and x
is open.
All variables were of types double
.
The running times are expressed in arbitrary units.expression | lambda expression | classic STL expression | hand-coded function object |
---|---|---|---|
ax | 330 | 370 | 290 |
-ax | 350 | 370 | 310 |
ax-(a+x) | 470 | 500 | 420 |
(ax-(a+x)) | 620 | 670 | 600 |
(ax) - (a+x) (bx - (b+x)) (ax - (b+x)) (bx - (a+x))) | 1660 | 1660 | 1460 |
Некоторые дополнительные тесты производительности с более ранней версией библиотеки описаны [Jär00].
BLL использует шаблоны довольно сильно, выполняя многочисленные рекурсивные моменты тех же шаблонов. Это имеет (по крайней мере) три последствия:
Хотя можно писать невероятно сложные выражения ягненка, это, вероятно, не хорошая идея. Совмещение таких выражений может в конечном итоге потребовать много памяти во время компиляции и быть медленными для компиляции.
Типы фанкторов lambda, которые возникают даже из самых простых выражений lambda, являются зашифрованными. Обычно программисту вообще не нужно иметь дело с типами фанктора ламбды, но в случае ошибки в экспрессии ламбды компилятор обычно выводит типы гамбда. Это может сделать сообщения об ошибке очень длинными и трудными для интерпретации, особенно если компилятор выводит всю цепочку мгновенных сообщений шаблонов.
C++ Стандарт предполагает уровень гнездования шаблона 17, чтобы помочь обнаружить бесконечную рецессию. Сложные шаблоны lambda могут легко превысить этот предел. Большинство компиляторов допускают большее количество вложенных шаблонов, но обычно требуют, чтобы предел явно увеличивался с аргументом командной строки.
BLL работает со следующими компиляторами, то есть компиляторы способны составлять тестовые случаи, включенные в BLL:
exception_test.cpp
приводят к внутренней ошибке компилятора. )В следующем списке описываются включенные тестовые файлы и функции, которые охватывает каждый файл:
bind_tests_simple.cpp
: Биндное выражение различных аритмов и типов целевых функций: указатели функций, функциональные объекты и функции-члены.
Функционный состав с связующими выражениями.bind_tests_simple.cpp
: Bind expressions of different arities and types of target functions: function pointers, function objects and member functions.
Function composition with bind expressions.[ORIG_END] -->bind_tests_simple_ function_references.cpp
: Повторяет все тесты от bind_tests_simple.cpp
, где целевая функция является указателем функции, но вместо этого использует ссылки на функции.
bind_tests_advanced.cpp
: Содержит тесты для вложенных выражений привязки, unlambda
, protect
, const_parameters
и break_const
. Тесты, проводящие фанкторы lambda в качестве реальных аргументов для других фанкторов lambda, карриинг и использование шаблона sig
для указания типа возврата объекта функции.
operator_tests_simple.cpp
:
Тесты с использованием всех операторов, которые перегружены для выражений ламбды, то есть, неарочный и бинарный арифметика,
немного,
сравнение
логически,
прибавления и прибавки,
соединение,
назначение,
субкрикт,
адрес,
Предпочтение и операторы комм.
Испытывается потоковая природа операторов сдвига, а также указатели арифметики с плюсами и минусами операторов.
operator_tests_simple.cpp
:
Tests using all operators that are overloaded for lambda expressions, that is, unary and binary arithmetic,
bitwise,
comparison,
logical,
increment and decrement,
compound,
assignment,
subscrict,
address of,
dereference, and comma operators.
The streaming nature of shift operators is tested, as well as pointer arithmetic with plus and minus operators.
[ORIG_END] -->member_pointer_test.cpp
: Указатель для оператора-члена достаточно сложен, чтобы гарантировать отдельный тест-файл.
control_structures.cpp
:
Tests for the looping and if constructs.
switch_construct.cpp
:
Includes tests for all supported arities of the switch statement, both with and without the default case.
exception_test.cpp
:
Includes tests for throwing exceptions and for try/catch constructs with varying number of catch blocks.
constructor_tests.cpp
:
Содержит тесты для constructor
, destructor
, new_ptr
, delete_ptr
, new_array
и delete_array
.
constructor_tests.cpp
:
Contains tests for constructor
, destructor
, new_ptr
, delete_ptr
, new_array
and delete_array
.
[ORIG_END] -->cast_test.cpp
: Tests for the four cast expressions, as well as typeid
and sizeof
.
extending_return_type_traits.cpp
: Испытания, расширяющие систему вычета обратного типа для определенных типов пользователей.
Содержит несколько операторов, определенных пользователем, и соответствующие специализации для шаблонов вычета обратного типа.
extending_return_type_traits.cpp
: Tests extending the return type deduction system for user defined types.
Contains several user defined operators and the corresponding specializations for the return type deduction templates.
[ORIG_END] -->is_instance_of_test.cpp
: Включает тесты для шаблона внутренне используемых признаков, который может определить, является ли данный тип примером определенного шаблона или нет.
is_instance_of_test.cpp
: Includes tests for an internally used traits template, which can detect whether a given type is an instance of a certain template or not.
[ORIG_END] -->bll_and_function.cpp
:
Содержит тесты для использования boost::function
вместе с фанкторами lambda.
bll_and_function.cpp
:
Contains tests for using boost::function
together with lambda functors.
[ORIG_END] -->Статья Practical considerations раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 18. Boost.Lambda может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 18. Boost.Lambda ::
реклама |