作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我一直在尝试自己学习 SEE 优化,但我不太明白,我认为一个简单的函数只清零内存很容易实现,所以我继续尝试实现它我自己。
这是从缓冲区开始循环到缓冲区结束并使用 _mm_store_si128 将其清零的零内存函数。
bool zeromem( byte * _dest, uint _sz )
{
if ( _dest == nullptr )
return false;
__m128i zero = _mm_setzero_si128( );
for ( auto i = rcast<__m128i*>( _dest ),
end = rcast<__m128i*>( _dest + _sz );
i < end; ++i )
{
_mm_store_si128( i, zero );
}
return true;
}
异常抛出:访问冲突 (0x00000) 即使指针不是 0x00000。
我做的测试只是分配1024字节的内存,然后调用zeromem。
第一次迭代时抛出异常。
最佳答案
_mm_store_si128
转换为 MOVDQA并要求操作数在 16 字节边界上对齐,这可能会导致异常。 IIRC,例如 Windows 没有实现显式对齐异常,因此它会导致访问冲突。关于 memset 实现,您可能对 this post comparing different approaches to filling a memory block with bytes 感兴趣.
关于c++ - _mm_store_si128 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35228933/
我是一名优秀的程序员,十分优秀!