std::move() 分配了一个堆栈 unordered_map?
std::move() a stack allocated unordered_map?
我只是想知道创建一个本地任务 unordered_map 是否明智,我稍后会像这样移动到全局 space:
void StatesRegister(std::vector<global_states_t>states)
{
// create temporary notify map
local_map tmp_map;
// fill map...
// move to global task map
TaskHandle_t handle = (void*)0x50;
// MUTEX
// emplace to global map
task_map.emplace(handle, std::move(tmp_map));
// /MUTEX
}
问题是我是否可以在这里使用 std::move...Afaik unordered_map 是一个 RAII 对象,因此当对象“托管”在任务堆栈上时,存储桶是保留在堆上。所以我希望 std::unordered_map 的 move-constructor 能够理解我正在尝试做的事情并将桶传递给堆上新创建的实例,但是会吗?
您的期望和代码都很好 - 您可以从局部变量 (tmp_map
) move-assign 到程序中其他地方的变量。更一般地说,unordered_map
不仅仅是“桶”——桶通常包含迭代器以转发每个存储元素的列表节点。无论如何,所有现有元素的所有权以及与之相关的 buckets/nodes 都将转移到 move-assigned-to 变量。您当然应该确保访问 move-assigned-to 变量的任何其他线程都以类似方式锁定互斥量。
我只是想知道创建一个本地任务 unordered_map 是否明智,我稍后会像这样移动到全局 space:
void StatesRegister(std::vector<global_states_t>states)
{
// create temporary notify map
local_map tmp_map;
// fill map...
// move to global task map
TaskHandle_t handle = (void*)0x50;
// MUTEX
// emplace to global map
task_map.emplace(handle, std::move(tmp_map));
// /MUTEX
}
问题是我是否可以在这里使用 std::move...Afaik unordered_map 是一个 RAII 对象,因此当对象“托管”在任务堆栈上时,存储桶是保留在堆上。所以我希望 std::unordered_map 的 move-constructor 能够理解我正在尝试做的事情并将桶传递给堆上新创建的实例,但是会吗?
您的期望和代码都很好 - 您可以从局部变量 (tmp_map
) move-assign 到程序中其他地方的变量。更一般地说,unordered_map
不仅仅是“桶”——桶通常包含迭代器以转发每个存储元素的列表节点。无论如何,所有现有元素的所有权以及与之相关的 buckets/nodes 都将转移到 move-assigned-to 变量。您当然应该确保访问 move-assigned-to 变量的任何其他线程都以类似方式锁定互斥量。