限制在C++中内联函数包装器

Gea*_*phy 1 c++ optimization inlining c++11

我的问题涉及在C++中对函数包装器应用内联优化,考虑以下代码,WorkerStructure对象使用封装了一些功能的函数包装器进行初始化.然后在调用WorkerStructure :: doSomeWork方法时使用函数包装器.

将workerFunction对象封装的功能在应用于WorkerStructure :: doSomeWork方法时会被内联吗?显然,如果在某个其他转换单元中定义了该功能,则workerFunction对象只封装一个函数指针,是否有任何其他情况需要内联不可能吗?

当通过函数包装器传递在不同转换单元中定义的lambda函数时,它是否实际上等效于传递函数指针?

struct WorkerStructure
{
    WorkerStructure(std::function <bool(float)> &f):workerFunction(f) {}

    void doSomeWork(float inputValue)
    {
        if(workerFunction(inputValue))
        {
            //do some conditional operation
        }
    }
    std::function <bool(float)> workerFunction ;
};
Run Code Online (Sandbox Code Playgroud)

Xeo*_*Xeo 5

本质上的多态性std::function使得实际内联调用非常困难.由于std::functionCAN故事任何调用实体; 你会如何编写内联代码?

它有点像内联通过基指针调用的虚函数,没有其他可用信息(也就是在调用之前没有从派生到基指针的赋值,编译器可能会使用它来启用内联).

大多数std::function情况下,使用void*指针和函数指针来实现模板化函数的特化,它可以实现实际的调用和转换.当然有变体使用虚函数来做到这一点,并且它们更清楚,为什么它非常难以实现.即使链接时优化也无法做任何事情,因为无关紧要,你已经拥有了你可以在呼叫站点获得的所有信息(这并不多).

这是使用模板函数版本指针的非常粗略的版本std::function,只处理存储和调用方面(省略内存管理,复制,移动,重置,空间优化等):

template<class Sig>
class function;

template<class R, class... Args>
class function<R(Args...)>{
  typedef R (*call_type)(void*, Args...);
  void* _obj;
  call_type _caller;

public:
  template<class F>
  function(F f)
    : _obj(new F(f))
    , _caller([](void* p, Args... args){ return (*static_cast<F*>(p))(args...); })
  {}

  R operator()(Args... args) const{
    return _caller(_obj, args...);
  }
};
Run Code Online (Sandbox Code Playgroud)

实例.我认为要检查实际内部_obj和调用_caller的位置是非常困难的function.

仅供参考,这是带有虚函数的版本.