2012-11-09 66 views
9

如果我这样做: -做std :: function和std :: bind做动态内存分配吗?

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

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

和 “物” 的一些成员

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

无论是否调用到std ::绑定或使用std ::的功能<>原因任何使用新的或其他的动态内存分配?或者是编译时分配的所有存储空间?如果标准没有说什么,那么在Visual Studio 2012中作为我的程序只需要在那里建立,为了提高效率,我可能需要在我想使用这种机制的地方避免动态内存分配。

+6

“效率我可能”你不应该对这样的效率做出假设。 – slaphappy

+5

每次将项目添加到列表时,使用'std :: list'都会导致内存分配。 –

+1

Ahahahahahaha在使用std :: list时避免动态分配 –

回答

14

的标准没有规定,但一般很容易地看到,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 ++)inline(functor)对象指针,函数指针和(非虚拟)成员函数指针,以及任何其他适合于相同覆盖区域的指针,例如,无国籍函子(union _Nocopy_types)。

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

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

好吧,这是有道理的,谢谢 – jcoder

0

我不知道这件事。按照ecatmur的说法,我想这取决于该平台的std的实现。对于类似的问题,我从代码项目中使用这个实现获得了很好的成功。它支持很多平台。非常好的记录和没有动态内存分配。应避免在游戏或模拟运行时

http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

通用动态内存分配。问题并不总是分裂或者是一个很大的瓶颈(这两个有效的理由都是可以避免的),而且事实上时间量往往是非确定性的。一个更具体的内存分配策略,比如'池化'或'成帧'在这里将是有利的。

http://g.oswego.edu/dl/html/malloc.html

相关问题