我知道 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/