2014-01-24 4 views
1

В настоящее время я работаю над простым и абстрактным эмулятором для процессоров, и я использую таблицу для перевода кодов кода машинного кода в действия. В настоящее время в этой таблице содержатся указатели на делегирование функций (предоставляемых внешней библиотекой), которые являются единственной опцией, которую я имел в то время (до C++ 11), чтобы можно было вызвать функции-члены экземпляров подкласса.C++ 11: Таблица указателей функций, Lambdas

Пока что Lambdas выглядит так, как будто они могут обеспечить идеальную замену, но я все еще хочу поддерживать указатели функций ванили. Этот учебник по lambdas показывает пример, где вы можете обращаться с lambdas и указателями функций одинаково, но мне интересно, можно ли хранить смешанный массив указателей на функции и lambdas, чтобы я мог также хранить их в одном и том же месте.

+2

Безгражданные лямбды (то есть без захвата) могут быть преобразованы в указатели функций. Таким образом, вы можете хранить как указатели на функции, так и безстоящие lambdas в массиве указателей на функции. – dyp

+0

Может ли lambdas без привязки привязываться к определенному экземпляру класса, чтобы он обращался к своим членам (и имел одну и ту же лямбду, как-то перестроенную другой функцией, чтобы указать на другой экземпляр того же класса)? – Miles

+0

В безстоящей лямбда единственными переменными, к которым вы можете получить доступ, являются переменные области статического локального и пространственного пространства имен (а также параметры лямбда). – dyp

ответ

4

std::function - это механизм для стирания типа для всех вызываемых объектов.

У вас может быть коллекция std :: function и поместить в указатели функций с этой подписью рядом с lambdas с этой подписью. Существует немного накладных расходов по сравнению с использованием указателей функций напрямую. Интересно отметить, что тип lambda, не указанный спецификацией, и поэтому не может быть записан напрямую, но всегда может быть помещен в std :: function wrapper.

+0

Спасибо! Однако мне интересно, насколько значительны накладные расходы по сравнению с использованием указателей на функции (выбор и вызов функций из этой таблицы является ядром функциональности моего эмулируемого процессора, и, хотя мне не нужны действительно высокоскоростные вещи, я необходимо убедиться, что это не станет узким местом). – Miles

+0

Недостаточно того, что мне нужно было выяснить, сколько накладных расходов есть. Я бы беспокоился об этом только в крайних случаях, когда вы находитесь в очень плотной петле, которая должна быть быстрой или что-то еще. –

+0

Да. Процессор работает в цикле, выполняя одну команду за другой. Каждый раз, когда он выполняет инструкцию, ему необходимо просмотреть эту таблицу функций и запустить один из них. EDIT: Но я точно не знаю, как быстро мне это нужно. – Miles

Смежные вопросы