【问题标题】:How to express that a function, upon returning, no longer references its pass-by-reference or pass-by-pointer parameters?如何表示函数在返回时不再引用其传递引用或传递指针参数?
【发布时间】:2022-01-24 07:51:54
【问题描述】:

在C++中,函数有引用传递或指针传递参数是很常见的,后者在C中也存在。(为方便起见,我在下面的讨论中只讨论指针。但是两者都存在问题。)问题是,函数是否会将指针存储在比函数调用更长的地方,并在函数返回后使用指针?如果是,则函数的调用者必须保持指针所指向的值,直到指针过期。

在 C++ 中,shared_ptr 可能是一种解决方案,但会产生明显的堆内存和线程安全开销。 unique_ptr 也不适用,因为调用者希望保留所有权。

我正在寻找一些语言结构,例如 const,可以在编译时强制执行,而不会产生任何运行时开销。假设它的名字是short_livedshort_lived T* ptr 是指向 T 类型值的指针 ptr。接收ptr 作为其参数的函数不应将ptr 的值存储到比当前函数调用(例如全局变量)范围更长的任何位置,无论是在当前函数中还是在从内部调用的任何子函数中当前功能。后一个“子函数”约束意味着ptr 不应作为非short_lived 指针传递给子函数。由于变量的范围更多的是运行时属性,为了简单的实现,编译器可以在接收函数中禁止来自short_lived指针的所有赋值。

当代 C/C++ 标准是否支持上述设想的行为?如果不是,原因是什么?

谢谢!

【问题讨论】:

  • 由于 C 和 C++ 是非常不同的语言,您应该为该语言选择一个且唯一的标签。
  • 这需要一个比 C++(更不用说 C)更复杂的类型系统。你看过 Rust 吗?
  • 没有什么类似于你在 C++ 中所要求的,也许有一些代码分析可以帮助你。我会说经验法则与您所要求的相反:如果一个函数采用指针或引用,则该函数不应在其生命周期之外存储/使用它。如果函数需要这样做,您应该将参数包装到 unique_ptr(如果可以)或另一个空结构,如 owner_ptr(请参阅 GSL),以清楚地表明您将存储指针/供以后使用和获取/共享所有权的参考。
  • C++ 中的引用是另一个隐藏重要信息的语言特性,这里它们的本质是指针。我可能是错的,但它们只不过是使用指针的额外恼人语法,并且很难设置为nullptr。 -- 无论如何,C++ 作为一种语言不支持这种生命周期检查。而 C 也没有。
  • 在现代 C++ 中,借用的指针就是 T*。这当然只是一个约定,不是编译器可以强制执行的。 C++ 类型系统还不够强大。

标签: c++ c pointers reference compiler-construction


【解决方案1】:

使用侵入式指针,您可以传递原始指针,并且将共享生命周期控制,而不会对堆分配或线程安全控制产生额外影响,因为计数器是原子的。

https://theboostcpplibraries.com/boost.smartpointers-special-smart-pointers

【讨论】:

  • 这是轻量级的引用计数(与shared_ptr 相比)。我正在寻找更多的是像const 这样的语言结构。但同样感谢 ;-)
  • 我确实进入了你现在期待的兔子洞,但在花了很多时间之后,我决定让我的生活和每个将害怕维护此代码的人的生活变得更轻松.
猜你喜欢
  • 2019-09-16
  • 2019-09-10
  • 2016-07-17
  • 2015-09-22
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多