在不同的线程中调用向量析构函数或清除

Call vector destructor or clear in a different thread

我有 unique_ptr 的巨大矢量。

当我需要执行 clear() 或调用析构函数时,需要 4-5 秒。

加速它的一种理论上的方法是创建临时向量,将它与我工作的巨大向量交换,然后启动一个线程并在临时向量上调用清除。

在互联网上查看时,我没有看到有人像这样要求优化。

我的优化有问题吗?

我想你的想法应该可行。例如,如果您有一些名为 X:

的数据的 std::vector
struct X
{
    // some data here
};

using DataStorage = std::vector<std::unique_ptr<X>>;

您可以使用 std::async 移动 DataStorage 对象并异步调用此对象的 clear():

DataStorage data;

// data usage

auto clear_task = std::async(std::launch::async,
    &DataStorage::clear, std::move(data));

// do some stuff here; data object is not used anymore

clear_task.wait();

这里没有不必要的复制:您只需移动 data 并指定要在单独的线程中调用 clear(),这样主线程就不会在执行清除操作时挂起。