【发布时间】:2016-09-09 16:57:44
【问题描述】:
我一直在研究这个话题,找不到具体的权威答案。我希望非常熟悉 C 规范的人可以回答 - 即确认或反驳我的断言,最好是引用规范。
断言: 如果一个程序包含多个编译单元(单独编译的源文件),编译器必须确保在调用另一个单元中的函数之前或从任何函数返回之前将全局变量(如果已修改)写入内存。此外,在任何函数中,必须在第一次使用之前读取全局。同样在调用任何函数之后,不在同一个单元中,全局必须在使用前读取。无论变量是否被限定为“易失性”,这些事情都必须是真实的,因为另一个编译单元(源文件)中的函数可以在编译器不知情的情况下访问该变量。否则,全局变量总是需要“易失性” - 即非易失性全局变量没有任何用途。
编译器能否以不同的方式处理同一编译单元中的函数?我为全局变量的“volatile”限定符找到的所有讨论都显示了同一编译单元中的所有函数。
编辑:编译器无法知道其他单元中的函数是否使用全局。因此,我假设上述条件。
我发现了另外两个问题,其中包含与该主题相关的信息,但他们没有直接解决问题,或者他们提供了我认为可疑的信息:
【问题讨论】:
-
为什么编译器必须确保在函数返回之前将全局变量写入内存?这实际上取决于 CPU 内核及其缓存处理。
-
您提供的两个链接都表明,如果没有
volatile,则无法保证该变量将永远从内存中读取。 -
@Riley,我知道他们是这么说的。出于我所说的原因,我相信他们一定是错的。
-
@Joachim,我的问题是指 C“虚拟机”和硬件内存缓存不起作用。
-
@PaulB C 不使用虚拟机。
标签: c global-variables volatile