Обертки функциональных объектов будут размером с структуру, содержащую указатель функции члена и два указателя данных. Фактический размер может значительно варьироваться в зависимости от базовой платформы; на 32-разрядной Mac OS X с GCC это составляет 16 байт, в то время как это 32 байта Windows с Visual C++. Кроме того, цель объекта функции может быть выделена на куче, если она не может быть помещена в буфер малого объекта в объекте<boost::function>.
Copying efficiency
Обертки объектов функции копирования могут потребовать выделения памяти для копии объекта функции. По умолчанию распределитель может быть заменен более быстрым пользовательским распределителем, или можно разрешить обертывание объекта функции только для хранения целей объекта функции путем ссылки (используя<ref>), если стоимость этого клонирования становится чрезмерной. Небольшие функциональные объекты могут храниться внутри самого объекта<boost::function>, повышая эффективность копирования.
Invocation efficiency
При правильной настройке компилятора вызов объекта функции требует одного вызова через указатель функции. Если вызов относится к свободному указателю функции, к этому указателю функции должен быть сделан дополнительный вызов (если компилятор не имеет очень мощного межпроцессуального анализа).
Combatting virtual function "bloat"
Использование виртуальных функций, как правило, вызывает «раздувание кода» на многих компиляторах. Когда класс содержит виртуальную функцию, необходимо выделить дополнительную функцию, которая классифицирует тип объекта. По нашему опыту, эти вспомогательные функции значительно увеличивают размер исполняемого файла при использовании многих<boost::function>объектов.
В Boost.Function был принят альтернативный, но эквивалентный подход с использованием бесплатных функций вместо виртуальных. Начало. Функциональный объект по существу содержит два указателя, чтобы сделать действительный целевой вызов: пустой указатель на объект функции, который он содержит, и пустой указатель на «инвокатор», который может вызвать объект функции, учитывая указатель функции. Эта функция инвокера выполняет аргументацию и обратную конверсию значений Boost. Функция обеспечивает. Третий указатель указывает на свободную функцию, называемую «менеджер», которая обрабатывает клонирование и разрушение объектов функции. Схема безопасна, потому что единственные функции, которые фактически обрабатывают объект функции, счетчик и менеджер, инстанцируются с учетом типа объекта функции, поэтому они могут безопасно отбрасывать входящий указатель пустоты (указатель объекта функции) на соответствующий тип.
Acknowledgements
В строительстве этой библиотеки участвовало много людей. Уильям Кемпф, Джесси Джонс и Карл Нельсон были чрезвычайно полезны в выделении интерфейса и объема для библиотеки. Джон Мэддок руководил формальной рецензией, и многие рецензенты давали отличные комментарии по интерфейсу, реализации и документации. Петр Димов привел нас к функциональному деклараторному синтаксису.
Статья Miscellaneous Notes раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 13. Boost.Function может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.