首页 > 解决方案 > 在 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)我很懒,想尽可能避免重构。

我想我真正要问的是还有其他我错过的方式吗?理想情况下是否有某种可以应用的优化,这意味着编译器可以省略在堆栈上创建临时项并允许我使用我的原始代码?

标签: c++c++14

解决方案


标准容器可能是一种解决方法:

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。


推荐阅读