Информация об изменениях

Сообщение Re[7]: встраивается ли boost/std::bind от 05.02.2015 1:04

Изменено 05.02.2015 1:08 Evgeny.Panasyuk

Здравствуйте, jazzer, Вы писали:

EP>>Думаю имелось в виду что шансов встроить указатель на функцию меньше (а не "мало"), так как очевидно код привязан не к типу, а к значению указателя.

J>Если значение указателя известно во время компиляции, то я не вижу вообще никакой разницы между лямбдой и байндером — компилятор встроит и там, и там.

Во-первых разница в том что именно компилятору приходится встраивать.
В случае с функциональным объектом — ему нужно только встроить обычный вызов, грубо говоря даже не прикладывая никаких усилий для доказательства того, что вызваться будет одна и та же функция. Есть тип, и с этим типом связанна конкретная функция, другой быть не может.
В случае с указателем на функцию — компилятору после инлайнинга требуется сделать constant propagation, чтобы убедится что вызов происходит по константному указателю, и только после этого встроить этот косвенный вызов.

Во-вторых разница может проявится при разных опциях компилятора: -Os, max-inline-recursive-depth, не говоря уже об -Od.
Например на -Os компилятор имеет полное моральное право сгенерировать только один вариант std::transform, для двух вызов с bind'ами, отличающимися только указателями на функции, но не типами.
Re[7]: встраивается ли boost/std::bind
Здравствуйте, jazzer, Вы писали:

EP>>Думаю имелось в виду что шансов встроить указатель на функцию меньше (а не "мало"), так как очевидно код привязан не к типу, а к значению указателя.

J>Если значение указателя известно во время компиляции, то я не вижу вообще никакой разницы между лямбдой и байндером — компилятор встроит и там, и там.

Во-первых разница в том что именно компилятору приходится встраивать.
В случае с функциональным объектом — ему нужно только встроить обычный вызов, грубо говоря даже не прикладывая никаких усилий для доказательства того, что вызваться будет одна и та же функция. Есть тип, и с этим типом связанна конкретная функция, другой быть не может.
В случае с указателем на функцию — компилятору после инлайнинга требуется сделать constant propagation, чтобы убедится что вызов происходит по константному указателю, и только после этого встроить этот косвенный вызов.

Во-вторых разница может проявится при разных опциях компилятора: -Os, max-inline-recursive-depth, не говоря уже об -Od.
Например на -Os компилятор имеет полное моральное право сгенерировать только один вариант std::transform для двух вызовов с bind'ами, отличающимися только указателями на функции, но не типами.