[英]C++ Return a functor object as std::function
我有一個工廠方法返回一個std::function
class Builder {
public:
function<void(Data&)> build();
}
和一個函子 object
class Processor {
protected:
vector<int> content_;
public:
void operator()(Data&) {
....
}
}
現在我想在工廠方法中返回函子,我寫
function<void(Data&)> build() {
Processor p;
// Add items to p.content_
function<void(Data&)> ret(p);
return ret;
}
我的問題是: ret
會保留p
的副本嗎? 如果是這樣,當p.content_
很大時,這會成為負擔嗎? 建議的實施方式是什么?
一個std::function
持有並擁有它的價值。 實際上,它需要可復制的可調用 object,以便在復制自身時可以復制它。
您的 function 會像這樣非常好,並且可能更快:
function<void(Data&)> build() {
Processor p;
// fill items
return p; // p moved into the returned std::function (since C++14)
}
但是,如果您復制std::function
周圍, Processor
object 也會被復制,因此復制std::function
的成本取決於類型(就像它包含的任何類型擦除工具一樣)
將使用的構造函數是這樣的:
template< class F >
function( F f );
可以看到 object 會被復制。 如果你想避免這種情況,你可以移動可調用對象:
function<void(Data&)> ret(std::move(p));
然后構造函數將f
移動到內部存儲。
如果您的可調用對象很小,它將直接存儲在 function object 中。 如果太大,內部存儲將被動態分配。 無論哪種方式,移動生成的 function object 應該不會比移動原始的可調用 object 復雜(當直接存儲在函數中時)甚至可能更便宜(當動態存儲時)。
當性能很重要時,應避免復制,因為即使您的可調用對象不需要它們,它也可能涉及動態分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.