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