gpt4 book ai didi

c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:47 25 4
gpt4 key购买 nike

我正在寻找一种标准方法来告诉 C++ API 的用户构造函数(或方法)是否接受分配在堆栈上的对象作为有效参数。是否有一种模式(例如,特殊的构造函数/方法签名)告诉这里没有堆栈对象/这里没有堆栈对象?如果在没有另外记录的情况下允许堆栈对象,是否存在默认假设的常识?

问题说明:当类 Vector6D 具有构造函数 Vector6D(const Vector3D& upper, const Vector3D& lower) 时,至少有两种方法可以实现该类:

a) 在构造函数中复制两个 vector 的元素并忘记 Vector3D 实例。

b) 聚合 Vector6D 中的 Vector3D 实例,并继续使用后续方法调用的引用。

对于 a) Vector3D 实例分配在哪里并不重要。对于 b),如果 Vector3D 实例分配在堆栈上,则当堆栈帧消失时,实现将停止工作。

因此,如果不查看实现或文档,用户就无法决定要做什么。

编辑:上下文是一个嵌入式软件项目,不允许我使用 STL、异常、提升等。

最佳答案

C++ 中没有机制强制构造函数(或其他可变成员方法)参数的生命周期超过对象的生命周期。

只有堆分配对象的所有权,通过std::unique_ptr<T>保存和传递, std::shared_ptr<T> ,或类似的,可以干净地表达和转移。

具有临时约定、编译器未强制执行、暗示参数存储为引用的类设计将被视为糟糕的类。

您应该考虑以下一般准则:

  • 廉价复制的类型应该被复制。
  • 不可复制的类型应该通过智能指针进行堆分配和传递/拥有。
  • 如果类型需要与具有独立生命周期的其他对象持久共享,则被认为“太昂贵”而无法复制的类型也应该分配智能指针。

当生命周期不是由 API 用户任意控制时,此堆分配策略有异常(exception),但在您上面描述的情况下则不然。

关于c++ - 如果允许堆栈分配的引用作为参数,如何进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25651245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com