2012-11-09 64 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

相關問題