c++ 如何存储数量可变的对象,而这些对象不是默认的可构造、可复制或可移动的?

35g0bw71  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(101)

我想要一个连续的对象数组(运行时已知的对象数量),但对象不是默认的可构造、可复制或可移动的。
背景资料:
我在开发一个数据处理程序。在执行开始时,输入对象指定需要创建多少Data对象进行处理。每个Data对象拥有其他资源,并且还从输入对象引用内存。在运行时,我反复循环数据对象,为每个对象执行任务。
理想情况下,出于性能考虑,我希望有一个连续的内存块包含所有Data对象。我最初是在开发std::vector时实现这一点的,方法是为所有Data对象保留内存,然后调用emplace_back,不管需要多少次。
我在调试时为开发跟踪数据添加了一个析构函数,我的代码不再编译,因为std::vector所必需的移动构造函数现在被隐式删除了。
事实上,数据对象不应该被复制或移动。尽管在我添加析构函数之前,move构造函数是隐式默认的,但它从未被调用,因为没有真正需要的移动。move构造函数的最大影响是它向二进制文件中添加了额外的代码,而这些代码永远不会被调用。虽然使Data可移动不会损害性能,但我更喜欢删除这些操作符,以强制这些对象不被复制或移动。这样我就能马上知道我是否在做我不想做的事情。
我在找一个惯用的解决方法。
我认为部分问题在于对象/数据是如此紧密耦合的。如果Data是默认可构造的,并且指向输入数据的指针是在构造后设置的,那么我可以使用unique_ptr<Data[]>
我也试过做一个固定大小的向量,似乎工作。我找到了eastl::fixed_vector,但它似乎需要在编译时而不是运行时定义的容量,并且需要一个可移动对象。
简单的示例代码如下:戈德博尔特

yc0p9oo0

yc0p9oo01#

如果您放弃连续数据要求,std::deque可能可以工作。

#include <iostream>

namespace {
struct X {
  X(int) {}
  X() = delete;
  X(const X&) = delete;
  X(X&&) = delete;
};
}  // namespace

int main() {
  std::deque<X> dq;
  dq.emplace_back(1);
  dq.emplace_back(2);
  dq.emplace_back(3);
}

字符串

相关问题