【问题标题】:What's the purpose of using pointer to std::shared_ptr in C++ library Gandiva在 C++ 库 Gandiva 中使用指向 std::shared_ptr 的指针的目的是什么
【发布时间】:2023-01-12 10:52:54
【问题描述】:

我正在学习 Apache Arrow 中的 Gandiva 模块。我发现许多 API 需要 std::shared_ptr *p 形式的参数。例如,here 是一个典型的 API

static inline Status Make(SchemaPtr schema, ConditionPtr condition, std::shared_ptr<Filter> *filter)

我不明白为什么需要使用指向 shared_ptr 的指针而不是简单的 shared_ptr。以我的理解,在C++中应该尽可能避免裸指针,而shared_ptr被设计成裸指针的替代品。

【问题讨论】:

  • “在 C++ 中应尽可能避免原始指针”- 最好将其表述为“尽可能合理”。最好将原始指针用作非拥有指针,而不是使用笨拙的(但可能!)长度来避免使用原始指针。

标签: c++ c++11 shared-ptr apache-arrow


【解决方案1】:

这是他们对输出参数的代码风格约定。

筛选[出去]返回的过滤器对象

用法

std::shared_ptr<Filter> filter;
Filter::Make(..., &filter);

我会用

Status Make(..., std::shared_ptr<Filter> &filter);

std::shared_ptr<Filter> filter;
Filter::Make(..., filter);

也许看到 &amp;filter 的用法,他们知道 filter 是一个不查看函数声明的输出参数。

Development Guidelines - Code Style, Linting, and CI

  • 我们更喜欢输出和输入/输出参数的指针(风格指南在某些情况下建议使用可变引用)。

【讨论】:

    【解决方案2】:

    这是 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. 该函数可以使用引用,但这些可以掩盖正在使用 out 参数的事实。 Make(a, b, c) 看起来像传递了三个正常参数,但 Make(a, b, &amp;c) 可以提示某人正在使用 out 参数。这是对 out 参数更喜欢指针而不是引用的原因之一。
    2. 该函数可能会返回 std::tuple&lt;Status, std::shared_ptr&lt;Filter&gt;&gt;

      有时在使用原始指针参数时,库可能会检查指针是否为空,并且在这种情况下不会为其分配任何内容。这将使 out 参数成为可选参数,这两个替代方案都无法处理。 (这里是一个使用带有原始指针的可选输出参数的 API 示例:https://doc.qt.io/qt-6/qstring.html#toInt

      现代 C++ 中的一般规则是在您想要控制所有权时避免使用原始指针。此示例不获取传入指针的所有权,因此不违反该规则。

      有些人遵守更严格的规则,他们试图避免到处使用指针,但这不太受欢迎。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-28
      • 2011-04-24
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2017-08-26
      相关资源
      最近更新 更多