c++ - move 语义以从缓冲区获取数据的所有权?

标签 c++ c++11 move-semantics

我目前处理一些数据记录,使用缓冲区,即在记录期间,数据存储在 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/

相关文章:

c++ - 为什么 std::copyable 包含 std::movable ?

C++:std::unordered_map 保证是基于节点的吗?

C++14 结构统一初始化

c++ - 为什么需要 move 语义来消除临时拷贝?

c++ - QGraphicsView EnsureVisible() 和 centerOn()

c++ - MSVC 2012 通过 SFINAE 检测模板函数的模板参数数量

c++ - move 构造函数可以接受类本身以外的参数吗?

c++ - C++ 源文件中的不可打印 (0xFF) 字节

c++ - Cython c++ 示例无法识别 c++,为什么?

c++ - Cuda - 从设备全局内存复制到纹理内存