std :: mem_fn (& method_defined_with_forceinline) (* this) не встроенный - PullRequest
0 голосов
/ 02 мая 2018

Это вызвано тем, что реализация mem_fn() определяется без __forceinline/inline/__attribute__((always_inline))? Можно ли обойти это, например, используя собственную реализацию mem_fn?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Итак, std :: mem_fn () по той или иной причине не встроен. Этого просто не может быть, поскольку оператор адреса использовался для определения адреса, так как вызовы обычных функций (также указанных через оператор адреса) являются встроенными. Я предполагаю, что это вызвано тем, что адрес метода хранится в каком-то объекте, созданном std :: mem_fn (). Решение здесь состоит в том, чтобы переписать функцию, для которой нужны указатели функций в качестве аргументов, чтобы она могла принимать указатели на методы. Полученный код на ассемблере больше не содержит операторов вызова.

Сама реализация std :: mem_fn () не дала никаких преимуществ - функции также не были встроены.

0 голосов
/ 02 мая 2018

Взятие указателя на функцию не позволяет ему быть встроенным.

Компилятор не сможет встроить его, если во время компиляции неизвестно, какая функция будет вызываться (через указатель или std::mem_fn), и в этом случае зачем сначала использовать std::mem_fn (когда вы можно вызвать функцию)?

...