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

时间:2013-09-14 15:55:42

标签: c++ windows memcpy memory-mapped-files

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

  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来获取数据。 有没有更快的方法来“获取我的数据”?

2 个答案:

答案 0 :(得分:2)

假设您的内存映射文件与uAudioInfo.Pitchmarks[0](可能是某种类型的结构)的类型具有完全相同的对齐和填充,您只需使用一个memcpy来复制整整很多,而不是memcpy你正在做的个别领域。

答案 1 :(得分:2)

“最快”可能是简单的任务:

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

可以代替函数中的所有memcpy次调用。