volatile是一个类型修饰符,遇到这个关键字声明的变量,编译器对访问该变量的代码就再也不进行优化,每次读取该变量的值都会直接从变量地址中读取数据。若是没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,若是这个变量由别的程序更新了的话,将出现不一致的现象。下面看一个例子。html
#include <stdio.h> int main() { int i = 0; int sum = 10; for(i=0;i<10;i++) { sum++; } printf("sum =%d\n",sum); return 0; }
gcc -S test.c 编译出汇编文件,查看汇编文件。ubuntu
.file "test.c" .section .rodata .LC0: .string "sum =%d\n" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl $0, -4(%rbp) movl $10, -8(%rbp) movl $0, -4(%rbp) jmp .L2 .L3: movl -8(%rbp), %eax //存值到%eax addl $1, %eax //对%eax操做 movl %eax, -8(%rbp) //存栈 addl $1, -4(%rbp) //计算 .L2: cmpl $9, -4(%rbp) jle .L3 movl -8(%rbp), %eax movl %eax, %esi movl $.LC0, %edi movl $0, %eax call printf movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4" .section .note.GNU-stack,"",@progbits
i不是volatile,sum是volatile变量。sum进行了存值操做,而i直接操做的栈。ide
下面这篇博客也有详细的示例优化
https://blog.csdn.net/StepByStepTo/article/details/77902449.net