簡單說,所有變數都是放在記憶體中,運算的時候根據指令的需要部分變數會首先被載入到暫存器中,然後進行運算,運算結果根據指令的需要儲存到記憶體中。從記憶體中載入變數到暫存器的過程中,如果有cache的話,cpu會首先根據變數的地址去查詢cache中是否有此變數,若有則表示命中,若無則去記憶體中取自己訪問這個變數,並將此變數所在的塊一起讀到cache中儲存(注意,不僅僅讀該變數),具體情況根據cpu中實現的cache讀寫策略的不同而定。另外,需要注意的是程式也是儲存在記憶體中,只是根據聯結器的連結腳本里的規則,程式和資料是從不同的地址開始的,具體可以檢視《程式設計師的自我修養》和《深入理解計算機系統》,或者找到gnu binutils去hacking裡面的連結指令碼ldscript。程式的起始地址會被儲存在pc中。而對於資料來說較為複雜一些,在記憶體中會分成好幾個段,因為資料還分為區域性變數(儲存在棧裡stack),全域性變數靜態變數(.bss段中)和常量(儲存在.bss段中),malloc或者new出來的東西放在堆上(heap)。因此,對於不同的架構對於這些段的訪問方式也不同,某些架構會提供所謂的資料指標(Data Pointer,DP)去訪問這些資料,還有一部分直接透過指令去訪問這些地址。上面說的這些都是在最簡單的系統中是這樣處理的。如果有硬碟,並且支援較為複雜作業系統的情況下(以x86,linux為例),作業系統需要透過mmu來進行記憶體管理,常見的段、頁排程策略就起作用了,將任務或者應用多包含的程式和資料在記憶體和硬碟之間調入調出。我說的也不完整,建議仔細閱讀《程式設計師的自我修養》和《深入理解作業系統》,並找個gcc編譯器反彙編對照一下,便於理解,沒什麼難的。
簡單說,所有變數都是放在記憶體中,運算的時候根據指令的需要部分變數會首先被載入到暫存器中,然後進行運算,運算結果根據指令的需要儲存到記憶體中。從記憶體中載入變數到暫存器的過程中,如果有cache的話,cpu會首先根據變數的地址去查詢cache中是否有此變數,若有則表示命中,若無則去記憶體中取自己訪問這個變數,並將此變數所在的塊一起讀到cache中儲存(注意,不僅僅讀該變數),具體情況根據cpu中實現的cache讀寫策略的不同而定。另外,需要注意的是程式也是儲存在記憶體中,只是根據聯結器的連結腳本里的規則,程式和資料是從不同的地址開始的,具體可以檢視《程式設計師的自我修養》和《深入理解計算機系統》,或者找到gnu binutils去hacking裡面的連結指令碼ldscript。程式的起始地址會被儲存在pc中。而對於資料來說較為複雜一些,在記憶體中會分成好幾個段,因為資料還分為區域性變數(儲存在棧裡stack),全域性變數靜態變數(.bss段中)和常量(儲存在.bss段中),malloc或者new出來的東西放在堆上(heap)。因此,對於不同的架構對於這些段的訪問方式也不同,某些架構會提供所謂的資料指標(Data Pointer,DP)去訪問這些資料,還有一部分直接透過指令去訪問這些地址。上面說的這些都是在最簡單的系統中是這樣處理的。如果有硬碟,並且支援較為複雜作業系統的情況下(以x86,linux為例),作業系統需要透過mmu來進行記憶體管理,常見的段、頁排程策略就起作用了,將任務或者應用多包含的程式和資料在記憶體和硬碟之間調入調出。我說的也不完整,建議仔細閱讀《程式設計師的自我修養》和《深入理解作業系統》,並找個gcc編譯器反彙編對照一下,便於理解,沒什麼難的。