C++:从内存映射文件中读取数据

C++: Reading data from a memory mapped file

本文关键字:读取 数据 文件 映射 内存 C++      更新时间:2023-10-16

我使用MapVirtualFile在Window下映射了一个文件C++使用VS2010。空是

  void*                   m_pVoiceData;

我现在想用数据填充一个结构。

我一直在使用

void clsMapping::FeedPitchmarksFromMap(udtPitchmarks &uAudioInfo,unsigned long int uBytePos)
{
    unsigned long int iCountPM;
    memcpy(&iCountPM, &((char*)(m_pVoiceData))[uBytePos],sizeof(int));
    uAudioInfo.Pitchmarks.resize(iCountPM);
    for (unsigned long int i=0;i<iCountPM;i++)
    {
        iBytePos+=sizeof(int);
        unsigned long int iByteStart;
        memcpy(&iByteStart, &((char*)(m_pVoiceData))[iBytePos],4);
        iBytePos+=sizeof(int);
        unsigned long int iByteCount;
        memcpy(&iByteCount, &((char*)(m_pVoiceData))[iBytePos],4);
        iBytePos+=sizeof(int);
        unsigned int iF0;
        memcpy(&iF0, &((char*)(m_pVoiceData))[iBytePos],4);
        uAudioInfo.Pitchmarks[i].ByteStart =iByteStart;
        uAudioInfo.Pitchmarks[i].ByteCount =iByteCount;
        uAudioInfo.Pitchmarks[i].F0 =iF0;
    }
}

正如人们所看到的,我目前正在使用memcpy来获取数据。有没有更快的方法来"让我的数据结束"?

"最快"可能是简单的赋值:

unsigned long iCountPM = 
    *reinterpret_cast<unsigned long*>(reinterpret_cast<char*>(m_pVoiceData) + uBytePos);

可以改为用于函数中的所有memcpy调用。

假设您的内存映射文件与uAudioInfo.Pitchmarks[0]类型(可能是某种结构)具有完全相同的对齐和填充,您可以只使用一个memcpy来复制整个批次,而不是像您当前所做的那样memcpy单个字段。