c - "register volatile int i"在 C 中的表现如何?

标签 c volatile

我知道 register 关键字会分配一个寄存器来计算值,而 volatile 关键字会在每次对变量执行一些计算时从内存中读取值,基本上不会优化代码。那么,如果一个变量同时被赋予了这两个关键字,是否意味着它本身本质上是易变的?我无法通过编写示例代码来理解这种行为。任何人都可以解释一下吗?

最佳答案

在 C 中,register 存储类的行为与 auto 存储类的行为完全相同,除了需要实现(根据 5.1.1.3)以在以下情况下发出诊断程序试图获取或使用对象的地址(6.5.3.2、6.7.1)。使用 register 作为对编译器的优化提示通常是没有意义的,因为编译器足够聪明,可以利用对象的非存储特性,当然也足够聪明,可以跟踪哪些对象可以被声明 注册;相反,它应该被理解为一种代码质量检查,即程序员没有通过获取对象的地址而无意中破坏优化机会。

换句话说,从有效程序中删除 register 关键字的所有实例对程序的语义没有影响;它在这方面类似于 static_assert

volatile 类型限定符表示对对象的访问(读取和写入)被认为是副作用,无法通过优化消除。对于不存在于定义位置内存中的对象(即具有 register 存储类的对象),这在性能测试中最有用:

start = time();
for (multiple loops)
    register volatile int result = test_function();
stop = time();
elapsed = stop - start;

关于c - "register volatile int i"在 C 中的表现如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12567940/

相关文章:

c - 该程序的输出未被接受

c - 尽管数据类型合适,随机 i 字符仍被打印到我的字符串哈希表中

java - java中是否需要添加 volatile 关键字来保证单例类的线程安全?

c# - "A reference to a volatile field will not be treated as volatile"含义

c++ - 对一段代码进行计时时是否需要 volatile?

c - Makefile 编译错误未应用 -std=c99

c - 在 C 中调用常数复数的最快方法

c - 实际示例使用 dup 或 dup2

java - Java中的 volatile 与静态

c++ - 不稳定的重载?