-1

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

4

2 回答 2

2

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

于 2013-09-14T16:04:27.817 回答
2

“最快的”可能是简单的分配:

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

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

于 2013-09-14T16:04:52.620 回答