寄存器和易失性有什么区别?什么时候用用哪一种?易失性寄存器变量是什么意思?

Rad*_*dhe 0 c volatile storage-class-specifier

寄存器和易失性有什么区别?什么时候使用哪一个?易失性寄存器变量的含义是什么?

register int a; volatile int a;

P__*_*J__ 6

volatile意味着变量的值可以被编译器不可见的东西改变。这意味着变量必须有一个有效的内存表示,它必须在任何使用前被读取,并在更改时存储。

register- 如果可能,变量应存储在寄存器中。寄存器没有地址,因此&不能对它们使用运算符。除了非常具体的形式外,现在大多数编译器都忽略了:

avr gcc 示例: register unsigned char counter asm("r3");

它将变量永久绑定到特定寄存器。它减少了寄存器池并使优化更加困难

注册无符号字符计数器 asm("r3");

例子:

volatile int y;

int x8(volatile int x)  // the x is read as many times as it is used
{
    return x * x * x * x * x * x * x * x; 
}

    sub     sp, sp, #8
    str     r0, [sp, #4]
    ldr     r3, [sp, #4]
    ldr     r1, [sp, #4]
    ldr     r2, [sp, #4]
    mul     r3, r1, r3
    mul     r3, r2, r3
    ldr     r2, [sp, #4]
    ldr     r0, [sp, #4]
    mul     r3, r2, r3
    mul     r3, r0, r3
    ldr     r2, [sp, #4]
    ldr     r0, [sp, #4]
    mul     r3, r2, r3
    mul     r3, r0, r3
    ldr     r0, [sp, #4]
    mul     r0, r3, r0
    add     sp, sp, #8
    bx      lr



int test(volatile int x) // parameter changed - stored
{
    return x++;
}

    sub     sp, sp, #8
    str     r0, [sp, #4]
    ldr     r0, [sp, #4]
    add     r3, r0, #1
    str     r3, [sp, #4]
    add     sp, sp, #8
    bx      lr


int test2(void) same as above
{
    return y++;
}
    ldr     r3, .L6
    ldr     r0, [r3]
    add     r2, r0, #1
    str     r2, [r3]
    bx      lr
Run Code Online (Sandbox Code Playgroud)