我想使用lambda函數來異步調用引用計數對象的一個方法:LAMBDA爲std ::函數轉換性能
void RunAsync(const std::function<void()>& f) { /* ... */ }
SmartPtr<T> objPtr = ...
RunAsync([objPtr] { objPtr->Method(); });
創建lambda表達式明顯創建一個副本,但我現在有將lambda表達式轉換爲std::function
對象的問題也會創建一堆我智能指針的副本,並且每個副本都會增加引用計數。
下面的代碼應該表現出這種行爲:
#include <functional>
struct C {
C() {}
C(const C& c) { ++s_copies; }
void CallMe() const {}
static int s_copies;
};
int C::s_copies = 0;
void Apply(const std::function<void()>& fct) { fct(); }
int main() {
C c;
std::function<void()> f0 = [c] { c.CallMe(); };
Apply(f0);
// s_copies = 4
}
雖然引用的數量恢復到正常的事後,我想,以防止過多的引用操作的性能的原因。我不確定所有這些複製操作來自哪裏。
有什麼辦法可以用我的智能指針對象的較少副本來實現這一點?
更新:編譯器是Visual Studio 2010中
很多副本有什麼不好?一個智能指針的副本是兩個指針的副本和一個數字的增量...不是爲了殺死性能 – Dani
爲什麼你不通過引用捕獲?正如'[&c] {c.CallMe(); };'和智能指針一樣。 ' – Nawaz
@Dani:在許多引用計數的智能指針中,算術是原子的,因此需要更多的開銷。 –