C++;:从内存映射文件读取数据 我使用MavaValueFrimefile在C++下使用VS2010在窗口下映射文件。 空虚是 void* m_pVoiceData;

C++;:从内存映射文件读取数据 我使用MavaValueFrimefile在C++下使用VS2010在窗口下映射文件。 空虚是 void* m_pVoiceData;,c++,windows,memcpy,memory-mapped-files,C++,Windows,Memcpy,Memory Mapped Files,我现在想用数据填充一个结构 我一直在使用 void clsMapping::FeedPitchmarksFromMap(udtPitchmarks &uAudioInfo,unsigned long int uBytePos) { unsigned long int iCountPM; memcpy(&iCountPM, &((char*)(m_pVoiceData))[uBytePos],sizeof(int)); uAudioInfo.Pi

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

我一直在使用

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;
    }
}
void clsMapping::FeedPitchmarksFromMap(udtPitchmarks&uAudioInfo,unsigned long int uBytePos)
{
无符号长整数整数整数;
memcpy(&iCountPM,&((char*)(m_pVoiceData))[uBytePos],sizeof(int));
uAudioInfo.Pitchmarks.resize(iCountPM);

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

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

unsigned long iCountPM = 
    *reinterpret_cast<unsigned long*>(reinterpret_cast<char*>(m_pVoiceData) + uBytePos);
unsigned long iCountPM=
*重新解释铸造(重新解释铸造(m_pVoiceData)+uBytePos);

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

您可以声明一个
long
变量,并将
sizeof(int)
复制到它。请记住
sizeof(long)
不必等于
sizeof(int)
。另外,它真的是
iByteStart
作为参数吗?还是
iBytePos
你的意思?谢谢。我现在输入错误并编辑了我的文章。是的,我犯了一个错误,假设int和long的大小相同。但是,在我的情况下是这样的,所以没有错误(目前).我会改变的。那会更快还是更优雅?@tmighty好吧,我猜两者都是,因为这是一个函数调用和(可能的)无循环。我进一步建议,如果内存映射文件的布局与内存中的结构数组完全相同,那么可以使用单个
memcpy
复制数组中的所有元素。这比“简单赋值”更快。您已经看到了我的代码。您能告诉我如何在一次匆忙中做到这一点吗?