斯科特·梅耶的「有效的現代C++」,討論與定製刪除使用std::unique_ptr
,並指出:的std ::的unique_ptr和自定義刪除器
刪除器是函數指針通常導致
std::unique_ptr
的大小從一個成長 字一二。對於作爲函數對象的刪除器,大小的改變取決於函數對象中存儲了多少狀態。無狀態函數對象(例如,來自沒有捕獲的lambda表達式)不會導致大小懲罰,這意味着當自定義刪除器可以作爲函數或無捕獲lambda表達式實現時,lambda是更可取的。
作爲一個例子,這樣的:
auto delInvmt1 = [](Investment* pInvestment) {
makeLogEntry(pInvestment);
delete pInvestment;
};
template<typename... Ts>
std::unique_ptr<Investment, decltype(delInvmt1)>
makeInvestment(Ts&&... args);
是比這更好的:
void delInvmt2(Investment* pInvestment) {
makeLogEntry(pInvestment);
delete pInvestment;
}
template<typename... Ts>
std::unique_ptr<Investment, void (*)(Investment*)>
makeInvestment(Ts&&... params);
我可以看到,在第二種情況下的指針刪除器功能需要被存儲在unique_ptr
,但爲什麼沒有類似的需要爲lambda情況存儲?
'std :: unique_ptr'正在使用空基優化,它允許存儲空對象(即沒有數據成員的類),而沒有額外的大小開銷。 – milleniumbug
在第一種情況下,邏輯是* type *的一部分,第二種情況是* value *的一部分。 –