c++ - 在 C++ 中重置大对象实例的最佳方法是什么
问题描述
我有一个要重置为其原始状态的类对象的实例。它有一个经过良好测试的构造函数。通常我会用这样的代码来做到这一点
myObject = MyObject{};
但是临时对象太大而无法放入堆栈。
我的选择是
1)在堆上创建一个默认的临时对象
auto* tempObject = make_unique<MyObject>();
myObject = *tempObject;
2) 使用放置新的位置销毁和重建
myObject.~MyObject();
new( &myObject) MyObject();
3) 将构造函数代码重构为一个单独的重置函数,该函数从构造函数和其他任何地方调用。
MyObject::MyObject()
{
reset();
}
//and
myObject.reset();
我不喜欢任何选项,特别是:1)在项目中的堆上分配,试图避免不必要的分配 2)脆弱且有异味我可以在 operator= 中使用放置 new(this) 吗?3)我很懒,想尽可能避免重构。
我想我真正要问的是还有其他我错过的方式吗?理想情况下是否有某种可以应用的优化,这意味着编译器可以省略在堆栈上创建临时项并允许我使用我的原始代码?
解决方案
标准容器可能是一种解决方法:
std::vector<MyObject> v(1); // require a capacity of 1
v.emplace_back(); // ok v[0] is now a ref to a heap constructed object
v.pop_back(); // destroys the object
v.emplace_back(); // and rebuilds it normally without any (de-)allocation
但这仍然是一个技巧,当我认为正确的解决方案是增加堆栈大小时。所有体面的编译器都有它的选项。
无论如何,重置方法也可以是一个不错且干净的解决方案,只要它从功能的角度来看是有意义的(对象被设计为可重置的)。如果没有,它又是一个 hack。
推荐阅读
- python - 使用 django-tables2 呈现带有字典列表的表行时遇到问题
- python - 使用python将JSON存储在数据库中
- c++ - 将值插入 C++ 中的向量向量(图形问题)
- java - 无法将数据写入镶木地板文件
- angular - Angular 类型“{}”缺少类型“Blob”的以下属性:大小、类型、arrayBuffer、切片和另外 2 个
- python - 在生产中(部署到 pythonanywhere.com) - 如何在 django admin 中将用户添加到组时解决此错误?
- pyspark - 具有不同大小的元组的 Rdd 到数据帧
- javascript - 在 Shiny 应用中获取实际域名(服务器名称)
- python - fnmatch 找不到“&”字符
- json - Flutter FutureBuilder 与 REST JSON 分页