处理用于构造有用值的旧变量
Dispose of old variable used to construct useful value
假设以下两个类:
struct A {
A() {}
};
struct B {
B(const A& a) {}
};
我多次遇到这样的情况:我必须创建一个类的临时实例才能构建我需要使用的实例。像这样:
A a;
// Do very complex computations using a;
B b(a);
// use b, a is not needed anymore.
return make_result(b);
我的问题是,有时a
在我的计算后持有的资源可能很重要,在我实例化b
之后,我想释放它们。同时,整个过程a -> b -> result
在逻辑上是非常紧凑的,我想避免将其拆分为函数,因为在这种情况下几乎没有任何收获。
C++有哪些可用的解决方案来解决此类问题?
你可以将默认构造的对象分配给A
,假设A
的赋值运算符正确地释放了"资源":
A a;
// Do very complex computations using a;
B b(a);
a = {};
// use b, a is not needed anymore.
return make_result(b);
您可以将B
更改为按值获取A
,并将构造的A
实例移动到B
:
struct A {
A() {}
};
struct B {
B(A a) {}
};
// ...
A a;
// Do very complex computations using a;
B b(std::move(a));
// use b, a is not needed anymore.
return make_result(b);
这有一个很好的优势,即B
的构造函数可以从A
对象中"窃取"资源。
您可以使用 lambda 构造A
并将其传递给B
:
B b([&]{
A a;
// Do very complex computations using a;
return a;
}());
// use b, a is not needed anymore.
return make_result(b);
您既可以使用 lambda 构造A
,也可以B
按值获取它:
struct A {
A() {}
};
struct B {
B(A a) {}
};
// ...
B b([&]{
A a;
// Do very complex computations using a;
return a;
}());
// use b, a is not needed anymore.
return make_result(b);
这允许B
从A
那里偷东西,但不会留下僵尸A
实例。
很大程度上,这取决于您在程序中创建的类。A
和B
都必须具有通用协议(或其他类的子协议(,以及暗示该协议的公共存储(例如某些自定义struct
的vector
(。如果是这种情况,则负责的类可以具有资源委派的功能(如set_owner
(,另一个类可以利用该函数。模式在很大程度上(或完全(取决于您拥有的类/资源/模式。
如果存在某些通用协议,则可以适当更改一个或两个(或多个(类。
如果类相似(例如,涉及继承或嵌套类(,则可以使用返回值优化、Name-RVO 或move
构造。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 既然我们有内联变量,extern const 还有用吗?
- 返回对变量的引用:有意义/有用
- 将局部变量声明为右值引用是没有用的,例如T&& r = move(v)?
- 处理用于构造有用值的旧变量