c++ - C++ 中内联函数包装器的限制

标签 c++ optimization c++11 inlining

我的问题涉及在 C++ 中的函数包装器上应用内联优化,考虑以下代码,WorkerStructure 对象使用封装了一些功能 block 的函数包装器初始化。然后在调用 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 ;
};

最佳答案

std::function 的多态性本质上使得内联调用非常非常非常困难。因为 std::function 可以描述任何可调用实体;你将如何编写内联代码?

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

大多数时候,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...);
  }
};

Live example.我认为很难检查 _obj_caller 的实际内容以及调用 function 的点。

仅供引用,here's the version with virtual functions .

关于c++ - C++ 中内联函数包装器的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654411/

相关文章:

c++ - C++ 中的 'side-effect' 到底是什么?

c++ - 你将如何在 C++ 中实现基本的反射?

c++ - 将方法中的指针分配给子类 C++

mysql - 如何在派生表的 where 条件中使用先前联接中的字段?

php - 优化 Mysql 查询

C++11 通过原始指针或引用获取 unique_ptr 的所有权?

c++ - 在类构造函数 C++ 中零初始化多维数组

c++ - strcmp() 的问题没有正确比较字符串

C++: 没有匹配函数来调用 ''

javascript - 优化 Jquery 代码 - 单击时添加和删除类