Здравствуйте, swingus, Вы писали:
EP>>Уверен что современные компиляторы легко оптимизируют подобные косвенные вызовы.
S>У современного компилятора столько же шансов соптимизировать std::bind(), сколько виртуальную функцию.
Какой конкретно bind? С указателем на функцию внутри?
Это смотря как считать. Результат bind часто используется в контекстах, где передаётся в шаблон функции, который где-то внутри сразу его вызывает (смотри пример jazzer'а), то есть грубо говоря статический полиморфизм. И после инлайнинга, легко доказывается что этот указатель на функцию константен.
А виртуальные функции практически всегда используются для динамического полиморфизма, при котором в месте вызова статически не известно какой конкретно метод нужно вызывать (хотя есть эвристические методы типа PGO).
И уж шансов соптимизировать подобный bind на порядки выше чем виртуальный вызов.
А вот если сравнивать с тем bind'ом, который принимает функциональные объекты — то тут вообще не о чём спорить, так как какой конкретно код нужно вызывать закодировано в типе возвращаемого объекта.
EP>>Думаю имелось в виду что шансов встроить указатель на функцию меньше (а не "мало"), так как очевидно код привязан не к типу, а к значению указателя.
S>Вот как раз Скотт говорит, что хранится указатель на функцию, так что это "очевидно" совсем не очевидно.
Так я и говорю, что здесь код привязан к значению, то есть хранится значение. Более того, для разных входных указателей на функции, но с одинаковым типом, получится одинаковый тип результата bind