我使用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来获取数据。 有没有更快的方法来“获取我的数据”?
答案 0 :(得分:2)
假设您的内存映射文件与uAudioInfo.Pitchmarks[0]
(可能是某种类型的结构)的类型具有完全相同的对齐和填充,您只需使用一个memcpy
来复制整整很多,而不是memcpy
你正在做的个别领域。
答案 1 :(得分:2)
“最快”可能是简单的任务:
unsigned long iCountPM =
*reinterpret_cast<unsigned long*>(reinterpret_cast<char*>(m_pVoiceData) + uBytePos);
可以代替函数中的所有memcpy
次调用。