我在C ++中具有以下代码。指针_p_s1和_p_s2指向更大的存储视频帧的存储区中的切片(每隔第二条视频行)(我们称之为* pFrameData)。只要pFrameData指向的内存区域中的数据发生变化,此代码就会按预期工作。
但是,如果发生这种情况,我需要更改pFrameData,则此代码会崩溃并显示错误:
引发异常:读取访问冲突。
p2 为0xFFFFFFFFFFFFFFFFFF。
我有一个标量版本的代码,并且在更改期间工作正常。这使我认为SSE register(?)会以某种方式保留指向旧pFrameData所指向的内存区域的指针,并且由于该指针已释放,因此会崩溃。
有什么办法可以解决这个问题?我正在X64环境中运行此代码。
void Merge8BitSSE2(uint8_t *_p_dest, const uint8_t *_p_s1, const uint8_t *_p_s2,
size_t i_bytes)
{
for (; i_bytes > 0 && ((uintptr_t)_p_s1 & 15); i_bytes--)
*_p_dest++ = (*_p_s1++ + *_p_s2++) >> 1;
for (; i_bytes >= 16; i_bytes -= 16)
{
__m128i xmm;
__m128i *adst = (__m128i*)_p_dest;
__m128i *p1 = (__m128i*)_p_s1;
__m128i *p2 = (__m128i*)_p_s2;
xmm = _mm_loadu_si128(p1);
xmm = _mm_avg_epu8(xmm, *p2);
*adst = _mm_loadu_si128(&xmm);
_p_dest += 16;
_p_s1 += 16;
_p_s2 += 16;
}
for (; i_bytes > 0; i_bytes--)
*_p_dest++ = (*_p_s1++ + *_p_s2++) >> 1;
}