我目前处理一些数据记录,使用缓冲区,即在记录期间,数据存储在 map
中。 ,当记录结束时,这张 map 被用来 build 一个CaptureRecord
它被推送到全局记录(类型为 std::vector<CaptureRecord>
),该记录存储到目前为止完成的每条记录。
最后一部分的代码如下所示:
void CaptureRecorder::stopDataRecording()
{
OutputDebugString(L"Stopping data recording\n");
//Omitted stuff
//The CaptureRecord ctor takes a map as parameter
m_globalRecord.emplace_back(m_currentCaptureElements);
m_currentCaptureElements.clear();
//Omitted stuff
}
问题是,如果这两行似乎需要一点时间(最多几秒钟),时间会随着记录的大小成比例地增加(这对我来说很明显,这里的拷贝有问题) .
所以我想做的是在创建 CaptureRecord
时通过emplace_back()
, 它拥有 m_currentCaptureElement
中包含的日期的所有权.问题是,我真的不知道该怎么做。我尝试使用 move 语义,即 std::move()
对于 emplace_back() 的参数,以及 CaptureRecord
的构造函数的以下代码:
CaptureRecord(std::map<int, ProcessedCaptElem> record):
recordContent(std::move(record))
{
for(auto& recordElement : recordContent){
m_timestamps.emplace_back(recordElement.second.timestamp);
m_intensities.emplace_back(recordElement.second.calculatedIntensity);
}
}
但它似乎没有任何效果(这让我相信它仍然“不能”从变量 m_currentCaptureElements
move )。
所以我的问题是:
是否可以做这样的事情(从某种缓冲区 move ,然后重置它)以及如何做?
注意:我完全接受不涉及 move 语义的建议。这些是我能想到的最接近于在不复制数据的情况下传递数据的方法,但可能还有其他我可能错过的不涉及 move 的解决方案。
最佳答案
首先,您想将m_currentCaptureElements
的内容传输到另一个对象。所以你需要 move
它。
m_globalRecord.emplace_back(std::move(m_currentCaptureElements));
m_currentCaptureElements.clear();
现在,要利用提供给 CaptureRecord
构造函数的右值映射,您需要一个构造函数重载,它采用对映射的右值引用。
CaptureRecord(std::map<int, ProcessedCaptElem>&& record):
recordContent(std::move(record))
{
// ...
}
如果您需要在 map 外单独存储时间戳和计算强度的拷贝,则不能从 map 中 move 项目,前提是您还想保留一份 map 拷贝。如果你真的不需要 map ,你可以将构造函数更改为
CaptureRecord(std::map<int, ProcessedCaptElem>&& record)
{
for(auto&& recordElement : record){
m_timestamps.emplace_back(std::move(recordElement.second.timestamp));
m_intensities.emplace_back(std::move(recordElement.second.calculatedIntensity));
}
}
假设您需要一个也接受左值的重载,您可以创建另一个构造函数来将项目复制到 map 之外。
CaptureRecord(std::map<int, ProcessedCaptElem> const& record)
recordContent(record)
{
for(auto const& recordElement : recordContent){
m_timestamps.push_back(recordElement.second.timestamp);
m_intensities.push_back(recordElement.second.calculatedIntensity);
}
}
关于c++ - move 语义以从缓冲区获取数据的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20053267/