为什么我的memcpy从字节向量到对齐的内存中实际上没有复制任何内容?

时间:2016-10-27 01:09:29

标签: c++ simd memory-alignment

    __m128i* pData = reinterpret_cast<__m128i*>(
        _aligned_malloc(
            128,
            16));

    std::vector<byte> sectorBytes = dataSet.GetSectorBytes(index);

    index &= 0xfff;

    memcpy(pData, &sectorBytes[index], 128);

正如您所看到的,我尝试将128字节从sectorBytes(无法保证16字节对齐)复制到pData中,这样做。不幸的是,在设置断点进行检查之后,我发现虽然sectorBytes正好具备我预期的,但pData [0]到pData [7]只包含零...所以实际上什么都没有被复制。

我不明白为什么没有被复制......为什么会这样?

当然,我尝试完成的较大任务是从指定偏移量的文件中获取128个字节,然后对它们执行_mm_xor_si128(),而不会因尝试执行simd操作而突然出现访问冲突数据不是16字节对齐的。为了促进讨论,​​这里是GetSectorBytes():

std::vector<byte> GetSectorBytes(
    _In_ const uint32_t index) const throw()
{
    std::vector<byte> buffer(0x1000);

    int indexOuter = index & 0xfffff000;

    _OVERLAPPED positionalData;
    positionalData.Offset = indexOuter;
    positionalData.OffsetHigh = 0;
    positionalData.hEvent = 0;

    ReadFile(
        hMappedFile,
        &buffer[0],
        0x1000,
        NULL,
        &positionalData);

    return buffer;
}

hMappedFile是使用CreateFile2创建的,并设置了FILE_FLAG_NO_BUFFERING标志。

0 个答案:

没有答案