gpt4 book ai didi

c++ - std::function 和 std::bind 做动态内存分配吗?

转载 作者:可可西里 更新时间:2023-11-01 16:31:16 24 4
gpt4 key购买 nike

如果我这样做:-

class Thing  
{
...
void function (const std::string& message);
};

std::list<std::function<void()>> work;

在“Thing”的一些成员中

work.push_back(std::bind(&Thing::function, this, "Hello"));

调用 std::bind 或使用 std::function<> 是否会导致使用 new 或其他方式进行任何动态内存分配?或者所有的存储空间都是在编译时分配的?如果标准没有说明任何内容,那么在 visual studio 2012 中呢,因为我的程序只需要在那里构建,为了提高效率,我可能需要在我考虑使用这种机制的地方避免动态内存分配。

最佳答案

标准没有指定,但一般来说很容易看出 std::function 至少在某些情况下必须分配内存:

struct huge { char c[10000]; };
void foo(const huge &);
std::function<void()>{std::bind(foo, huge{})};

另一方面,至少在某些情况下,它可以通过将其函数对象放置在 function 对象占用空间内的预分配缓冲区内来避免分配;显然需要权衡,因为这可能会使其他用途占用更多堆栈内存。一个好的实现应该能够在将原始函数指针存储在 function 对象中时避免内存分配,并且可能还用于 mem_fn,但不太可能为 bind 这样做。

例如,libstdc++ (g++) 内联(仿函数)对象指针、函数指针和(非虚拟)成员函数指针,以及适合相同占用空间的任何其他内容,例如无状态仿函数 ( union _Nocopy_types )。

如果可以,通过反转你的控制流来接受模板仿函数对象而不是 function 你可以避免任何额外的内存分配:

template<typename F>
void my_algorithm(const F &);
my_algorithm(std::bind(foo, huge{}));

关于c++ - std::function 和 std::bind 做动态内存分配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13307090/

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