对具有“易失性”属性的动态分配变量的内存访问是不是会导致每次访问的缓存未命中?

Posted

技术标签:

【中文标题】对具有“易失性”属性的动态分配变量的内存访问是不是会导致每次访问的缓存未命中?【英文标题】:Will a memory access to a dynamically allocated variable with attribute "volatile" cause cache misses for every access?对具有“易失性”属性的动态分配变量的内存访问是否会导致每次访问的缓存未命中? 【发布时间】:2022-01-14 12:19:43 【问题描述】:

我的理解是,“volatile”限定符表示编译器不要缓存变量并在每次访问时从主内存中读取它。而且我相信处理器无法在不将其缓存的情况下获取内存,请澄清谢谢

【问题讨论】:

volatile 主要影响优化,而不是缓存(尽管它可能会影响缓存作为副作用) “缓存”变量在优化编译器的上下文中意味着将它保存在寄存器中而不从内存中重新加载。 【参考方案1】:

C 标准将其留给每个 C 实现来定义构成对 volatile 对象的访问。 C 2018 6.7.3 8 说:

... 构成对具有 volatile 限定类型的对象的访问是实现定义的。

在典型的 C 实现中,访问 volatile 对象需要加载或存储指令,因此只要 C 程序访问该对象,处理器就会访问内存。此外,缓存一致性通常由硬件提供,以便访问同一内存的其他线程或进程及时看到更改(即以与程序语义一致的某些顺序),但细节各不相同。

由于访问是实现定义的,因此 C 实现可以定义对 volatile 对象的访问以需要一些额外的内存同步,或者可以将其定义为无用,只需访问编译器缓存的任何寄存器.

【讨论】:

以上是关于对具有“易失性”属性的动态分配变量的内存访问是不是会导致每次访问的缓存未命中?的主要内容,如果未能解决你的问题,请参考以下文章

易失性变量“读取”是不是与正常读取一样快?

易失性变量和非易失性重新排序/可见性

Java 内存模型:易失性变量和发生前

C# 内存模型和非易失性变量在其他线程创建之前初始化

优化volatile变量

易失性关键字和线程本地内存[关闭]