簡體   English   中英

在 C++ 庫 Gandiva 中使用指向 std::shared_ptr 的指針的目的是什么

[英]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 中記錄為這樣。

還有其他選擇。

  1. function 可以使用引用,但這些可以掩蓋正在使用 out 參數的事實。 Make(a, b, c)看起來像傳遞三個正常參數,但Make(a, b, &c)可以提示某人正在使用 out 參數。 這是對 out 參數更喜歡指針而不是引用的原因之一。
  2. function 可以返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM