__m128i* p_aoffsets = (__m128i*)aoffsets;
    __m128i* p_boffsets = (__m128i*)boffsets;
    int n_count = MATCH_MASK / 8 + 1;
    for(int i = 0; i < n_count; ++i)
    {
      p_aoffsets[i] = _mm_subs_epi16(p_aoffsets[i], p_boffsets[i]);
    }
如上一段代码,DEBUG模式下可以正常运行,但RELEASE时第一次循环就会出错,根本原因还是在于内存未对齐造成的。参见http://bbs.csdn.net/topics/360044337。

#pragma pack(16),__declspec(align(16))就是两坨屎,想搞
SSE,绝对,千万,永远,不要用!!! 我用了一整年的movupd啊!!!!!!
最后找遍了整个中文世界没有,还是请教写汇编的老外得到了精华,
想对齐16字节,最好的办法是人肉手动对齐内存...

整理后的对齐函数:
static inline void* align(const void* x, int n)
{
  int p = (int)x;
  p = (p % n == 0)? (p) : (p + n - p % n);
  return (void*)p;
}

使用时先分配比需要的字节数多n个字节(n为希望的对齐数),然后调用函数返回对齐后的地址,示例:
char a_block_head[MATCH_MASK * 2 + 16u] = {0};
uint16_t* aoffsets = align(a_block_head, 16);

最后,赞同那位老兄说的,#pragma pack和__declspec(align())的确是两坨屎,哈哈。