首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 const 與 volatile 深度解析:編譯器優化、硬體存取與面試必考題

     編輯:關於C語言

C 語言 const 與 volatile 深度解析:編譯器優化、硬體存取與面試必考題

const 陷阱:編譯器優化導致的「假常數」

const char i = 1;
char *j = (char *)&i;
*j = 2; // 透過指標修改
printf("%d, %d\n", i, *j); // 輸出: 1, 2

現象:i 在記憶體中確實被改為 2,但 printf 輸出 i 卻仍為 1。

原因:編譯器見 const,優化時直接將 i 的值 (1) 嵌入指令碼,而非從記憶體讀取。組合語言中:mov eax, 1 而非 mov eax, [i]。

解決:加 volatile 強制編譯器每次從記憶體讀取:volatile const char i = 1;。

volatile 設計初衷

告訴編譯器:此變數可能被「意想不到」地改變 (硬體、中斷、多執行緒),禁用快取優化,每次存取必須讀寫記憶體。

volatile 典型應用場景

  1. 硬體暫存器 (如狀態暫存器)。
  2. 中斷服務程式 (ISR) 修改的非自動變數。
  3. 多執行緒共享變數 (但需配合原子操作/鎖,volatile 不保證原子性)。

經典面試三題

  1. 參數可同時是 const 和 volatile 嗎? 是。例:唯讀狀態暫存器——硬體可改 (volatile),程式不可改。
  2. 指標可以是 volatile 嗎? 是。例:ISR 修改指向緩衝區的指標。
  3. 下列函數有何錯誤?
    int square(volatile int *ptr) {
        return (*ptr) * (*ptr); // 錯誤:ptr 可能在兩次讀取間被改變
    }
    正確寫法:
    long square(volatile int *ptr) {
        int val = *ptr; // 只讀一次
        return (long)val * val;
    }

總結

  • const:語意承諾「不修改」,編譯器可優化。
  • volatile:語意警告「可能外部修改」,禁用優化。
  • 兩者可組合,針對不同場景。
  • 嵌入式開發必須精通,否則將釀成災難。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved