gpt4 book ai didi

c++ - 避免使用 std::function 和成员函数分配内存

转载 作者:IT老高 更新时间:2023-10-28 21:35:27 32 4
gpt4 key购买 nike

此代码仅用于说明问题。

#include <functional>
struct MyCallBack {
void Fire() {
}
};

int main()
{
MyCallBack cb;
std::function<void(void)> func = std::bind(&MyCallBack::Fire, &cb);
}

valgrind 的实验表明,分配给 func 的行在 linux 上使用 gcc 7.1.1 动态分配大约 24 个字节。

在实际代码中,我有几个不同的结构,它们都带有 void(void)存储在约 1000 万个 std::function<void(void)> 中的成员函数.

有什么方法可以避免在执行 std::function<void(void)> func = std::bind(&MyCallBack::Fire, &cb); 时动态分配内存? (或以其他方式将这些成员函数分配给 std::function)

最佳答案

不幸的是,std::function 的分配器已在 C++17 中删除。

现在,在 std::function 中避免动态分配的公认解决方案是使用 lambdas 而不是 std::bind。这确实有效,至少在 GCC 中 - 它有足够的静态空间来存储您的情况下的 lambda,但没有足够的空间来存储 Binder 对象。

std::function<void()> func = [&cb]{ cb.Fire(); };
// sizeof lambda is sizeof(MyCallBack*), which is small enough

作为一般规则,对于大多数实现以及仅捕获单个指针(或引用)的 lambda,您将避免使用此技术在 std::function 内进行动态分配(它正如其他答案所暗示的那样,通常也是更好的方法)。

请记住,要使其工作,您需要保证此 lambda 将比 std::function 生命周期更长。显然,这并不总是可能的,有时您必须通过(大)拷贝来捕获状态。如果发生这种情况,目前没有办法消除函数中的动态分配,除了自己修补 STL(显然,一般情况下不推荐,但在某些特定情况下可以这样做)。

关于c++ - 避免使用 std::function 和成员函数分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46163607/

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