[英]What's the purpose of using pointer to std::shared_ptr in C++ library Gandiva
我正在 Apache Arrow 中學習 Gandiva 模塊。 我發現許多 API 需要std::shared_ptr<T>*
形式的參數,例如這里是一個典型的 API:
static inline Status Make(SchemaPtr schema, ConditionPtr condition, std::shared_ptr<Filter> *filter)
我不明白為什么它使用指向shared_ptr
的指針而不是簡單的shared_ptr
。 以我的理解,在C++中應該盡量避免使用原始指針,而shared_ptr
被設計為使用原始指針的替代方案。
這是 API 向您“返回” shared_ptr
的一種方式。 我沒有使用過這個庫,但這里有一個 API 可能會做什么的例子:
static inline Status Make(SchemaPtr schema, ConditionPtr condition, std::shared_ptr<Filter> *filter) {
// ...more stuff here...
// Assign a new instance of shared_ptr to the variable that the caller passed in
*filter = std::make_shared<Filter>(...);
return Status{"ok"};
}
這通常稱為“out”參數,它在您鏈接的 API 中記錄為這樣。
還有其他選擇。
Make(a, b, c)
看起來像傳遞三個正常參數,但Make(a, b, &c)
可以提示某人正在使用 out 參數。 這是對 out 參數更喜歡指針而不是引用的原因之一。std::tuple<Status, std::shared_ptr<Filter>>
代替。有時在使用原始指針參數時,庫可能會檢查指針是否為 null 並且在這種情況下不會為其分配任何內容。 這將使 out 參數成為可選參數,而這些替代方案都無法處理。 (這里是一個 API 的例子,使用帶有原始指針的可選輸出參數: https://doc.qt.io/qt-6/qstring.html#toInt )
現代 c++ 中的一般規則是在您想要控制所有權時避免使用原始指針。 此示例不獲取傳入指針的所有權,因此不違反該規則。
有些人遵守更嚴格的規則,他們試圖避免到處使用指針,但這不太受歡迎。
這是他們針對 output 參數的代碼風格約定。
filter – [out]返回的過濾器 object
用法
std::shared_ptr<Filter> filter;
Filter::Make(..., &filter);
我會用
Status Make(..., std::shared_ptr<Filter> &filter);
std::shared_ptr<Filter> filter;
Filter::Make(..., filter);
也許看到用法&filter
他們知道filter
是一個 output 參數,而沒有查看 function 聲明。
Apache Arrow 開發指南 - 代碼風格、Linting 和 CI
- 我們更喜歡 output 和輸入/輸出參數的指針(風格指南在某些情況下建議使用可變引用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.