关于volatile变量的一个测试

int fn(int);

int main()                   
{
    int a=10;           subq    $8, %rsp    
    int b=15;           movl    $20, %edi //c=20
    int c=20;           call    fn
    int d;              leal    1(%rax), %edi //b=a+1
    a=fn(c);            call    fn
    b=a+1;              movl    $0, %eax //return 0
    d=fn(b);            addq    $8, %rsp
}               
int fn(int);        

int main()                  main:
{                               subq    $24, %rsp
    volatile int a=10;          movl    $10, (%rsp) //a=10
    volatile int b=15;          movl    $15, 4(%rsp) //b=15
    volatile int c=20;          movl    $20, 8(%rsp) //c=20
    volatile int d;             movl    8(%rsp), %edi //fn(c)
                                call    fn
    a=fn(c);                    movl    %eax, (%rsp) //a=fn(c)
    b=a+1;                      movl    (%rsp), %eax //b=a
    d=fn(b);                    addl    $1, %eax //b=b+1
}                               movl    %eax, 4(%rsp) //写回
                                movl    4(%rsp), %edi //fn(b)
                                call    fn
                                movl    %eax, 12(%rsp) 
                                movl    $0, %eax
                                addq    $24, %rsp
                                ret

小结:


用volatile声明的变量,每次使用的时候都会重新从内存中读取其值,比如第二
个例子中的变量b,在第二次调用fn()的时候,并不是从寄存器eax中将值传递给
fn,而是从寄存器中重新读取,在第一个例子中是直接将b的值传递到edi(edi
一般是函数第一个参数所在寄存器)。另外,对于声明volatile的变量,会阻止
编译器优化它,第一个例子中,其c程序中前面三段变量声明直接被优化了,而第
二个例子中,依然会声明。

猜你喜欢

转载自blog.csdn.net/w1157984197/article/details/80905517