gpt4 book ai didi

c++ - 防止 gcc 中的 std::function 分配内存或增加阈值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:17 24 4
gpt4 key购买 nike

有什么方法可以防止 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com