【发布时间】:2022-01-24 07:51:54
【问题描述】:
在C++中,函数有引用传递或指针传递参数是很常见的,后者在C中也存在。(为方便起见,我在下面的讨论中只讨论指针。但是两者都存在问题。)问题是,函数是否会将指针存储在比函数调用更长的地方,并在函数返回后使用指针?如果是,则函数的调用者必须保持指针所指向的值,直到指针过期。
在 C++ 中,shared_ptr 可能是一种解决方案,但会产生明显的堆内存和线程安全开销。 unique_ptr 也不适用,因为调用者希望保留所有权。
我正在寻找一些语言结构,例如 const,可以在编译时强制执行,而不会产生任何运行时开销。假设它的名字是short_lived。 short_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