有什么方法可以防止gcc中的std::function为较大的函数对象动态分配内存?

我希望以下代码在没有动态分配的情况下也能正常工作:

#include <functional>
#include <iostream>

// replace operator new and delete to log allocations
void* operator new (std::size_t n) {
    std::cout << "Allocating " << n << " bytes" << std::endl;
    return malloc(n);
}
void operator delete(void* p) throw() {
    free(p);
}

  class TestPlate
  {
    private:
        int value;

    public:
        int getValue(){ return value; }
        void setValue(int newValue) { value = newValue; }

        int doStuff(const std::function<int()>& stuff) { return stuff(); }

  };

int main()
{
    TestPlate testor;
    testor.setValue(15);
    const std::function<int()>& func =  std::bind(&TestPlate::getValue, &testor);

    std::cout << testor.doStuff(func) << std::endl;
    testor.setValue(25);
    std::cout << testor.doStuff(func) << std::endl;
}

但是,它分配24个字节。据我所知,这是因为指向方法的指针需要16个字节,而指向类实例的指针又需要8个字节。这似乎比功能对象可用的内部存储器大A或比普通错误B大。

我想知道是否有任何方法可以在不更改std::function签名或创建很多其他包装器代码的情况下规避这种类型的行为。

最佳答案

不幸的是,GCC的function仅在内部存储了指向成员函数的指针的空间,因此您的bind表达式的结果不合适。

您可以改用lambda表达式:

std::function<int()> f = [&]{ return testor.getValue(); };

这仅需要一个封闭类型的空间,该封闭类型包含对testor的引用(它是指向成员的指针的大小的一半,是绑定(bind)结果的大小的三分之一),并且GCC定义了该封闭,因此可以将其存储在std::function中。

关于c++ - 防止gcc中的std::function分配内存或增加阈值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38667268/

10-17 00:07