gpt4 book ai didi

c++ - 使用什么 std::optional 或 std::unique_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:24 27 4
gpt4 key购买 nike

我有一个包含动态分配成员的类(仅在使用时才分配)。

这样想:

class A {};

class B {
A* aMember;
};

用什么替换 A* 会更好:std::optionalstd::unique_ptr

以及何时使用 std::optional 而不是 std::unique_ptr

最佳答案

std::optional<A>保证不会发生辅助内存分配。这意味着 A 类型的潜在对象的原始缓冲区嵌入到 std::optional<A> .它是 std::optional 的组成部分的内存占用。这意味着 std::optional<A> 的内存大小总是至少为sizeof(A) ,无论是否可选 A对象当前是否存在。那是多少std::optional<A>将贡献总规模 B .

std::unique_ptr<A>是一个指针。它的大小与普通裸指针的大小大致相同。那是多少内存std::unique_ptr<A>自己占据里面B .为了让它指向一个有效的 A对象你必须分配那个 A别处,独立。当A存在,它占用内存。当A不存在不占用内存。

以上是您做出决定时需要考虑的因素。 std::optional<A>不涉及动态内存分配/取消分配,但您为此付出的代价可能是您 std::optional<A> 中“浪费”的内存.使用 std::optional对于大量实例化和/或大型对象可能会被证明是相当浪费的,尤其是当对象的大部分生命周期都处于空状态时。

这意味着 std::optional 的目的并不完全针对可选的长期存储。 std::optional是要在本地使用的东西:例如作为可选的局部值,函数的可选参数,可选的返回值。长期使用也是可以的,只要你不是大量实例化这样的对象。

std::unique_ptr<A>不会浪费内存,但您为此付出的代价是动态内存分配/释放。

当然,所有权语义也大不相同。 std::optional是可复制的。 std::unique_ptr是可移动的,但不可复制。

关于c++ - 使用什么 std::optional 或 std::unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44856701/

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