_mm_stream_load_si128(movntdqa)是否会修改其参数指向的内存?
问题解答
1. _mm_stream_load_si128不会修改mem_addr指向的内容
它和_mm_load_si128的核心功能完全一致:都是从指定内存地址读取128位整数数据返回,全程只有对源内存的读操作,不会执行任何写入行为修改源地址的内容。
2. 采用非const参数声明的设计动机
这个设计并非是函数会修改内存,主要有以下几方面原因:
- 特殊的访问副作用:
_mm_stream_load_si128对应底层SSE4.1的MOVNTDQA指令,属于非临时加载指令,设计初衷是读取不会被重复访问的大块数据,不会把读取的数据塞入CPU各级缓存,部分架构下甚至会触发对应地址缓存行的无效化操作。虽然没有修改内存存储的内容,但它改变了内存对应的缓存状态这种可观测的附加属性,不符合C/C++中const指针隐含的「访问不会改变指向内容的可观测状态」的语义约定。 - 历史兼容要求:这个intrinsic最早在Intel官方编译器头文件中定义时就采用了非const签名,后续GCC、Clang等主流编译器为了兼容已经基于这个签名编写的大量存量代码,没有调整参数的const属性,避免引发大面积编译报错。
- 贴合实际使用场景:非临时加载绝大多数情况下都用于访问写合并(WC)类型的内存,比如显存、外设映射内存等,这类内存本身很少会被定义为const,非const的指针声明更符合它的常规使用场景。
内容的提问来源于stack exchange,提问作者MWB
相关产品推荐
相关产品推荐

