Если у меня есть класс функторов без состояния, но я создаю его из кучи с новыми, достаточно ли типичных компиляторов достаточно, чтобы полностью оптимизировать затраты на создание?
Этот вопрос возник при создании группы функторов без сохранения состояния. Если они размещены в стеке, означает ли это, что их тело класса состояния 0 означает, что стек действительно не изменяется вообще? Кажется, это должно произойти, если позже вы возьмете адрес экземпляра функтора.
То же самое для распределения кучи.
В этом случае функторы всегда добавляют (тривиальные, но ненулевые) издержки при их создании. Но, возможно, компиляторы могут видеть, используется ли адрес, и если нет, то могут устранить это выделение стека. (Или это может даже устранить куча выделение?)
А как насчет функтора, который создан как временный?
#include <iostream>
struct GTfunctor
{
inline bool operator()(int a, int b) {return a>b; }
};
int main()
{
GTfunctor* f= new GTfunctor;
GTfunctor g;
std::cout<< (*f)(2,1) << std::endl;
std::cout<< g(2,1) << std::endl;
std::cout<< GTfunctor()(2,1) << std::endl;
delete f;
}
Итак, в приведенном выше конкретном примере каждая из трех строк вызывает один и тот же функтор тремя разными способами. В этом примере, есть ли разница в эффективности между способами? Или же компилятор может оптимизировать каждую строку вплоть до оператора печати без вычислений?
Edit:
В большинстве ответов говорится, что компилятор никогда не сможет встроить / устранить функтор, выделенный в куче. Но так ли это на самом деле? Большинство компиляторов (GCC, MS, Intel) также имеют оптимизацию времени соединения, которая действительно могла бы выполнить эту оптимизацию. (но делает ли это?)