回覆列表
  • 1 # 使用者7052043671405

    根據變數的不同,變數的存放位置也不同:(僅針對C/C++)

    1)全域性變數和靜態變數:全域性、靜態變數是事先已經放在固定的記憶體位置,系統在初始化時,會將全域性變數放置在已初始化或未初始化資料段(即.bss和.data段)。全域性變數和靜態變數只是相對程式的作用域不同,但軟體上都理解為一個記憶體地址,在編譯時已經確定。

    2)區域性變數。區域性變數理論上是儲存在堆疊中,被呼叫函式執行時,會先移動堆疊指標,騰出該程式需要的區域性變數,因此,區域性變數和引數傳遞可以理解在堆疊中,程式透過堆疊指標加偏移的方式訪問 ---- 地址並不固定,僅偏移量固定。因為最佳化的原因,部分區域性變數會放置在暫存器中。

    3)對於C++的成員變數。C++的成員變數是相對this指標(關於this本身,Linux和Windows稍有不同)。因此,確切說C++成員變數的存放位置與該類例項有關:即根據類的實現參考見1、2,但在內部表現是一致的,都是this指標加上一固定偏移量。

    多數系統,在系統啟動時,會將未初始化(.bss)資料段清零,因此,多數全域性變數和靜態變數初值為0,單區域性變數不會,其初值不確定。但正規情況下,所有變數必須初始化

    補充話題:

    對於多數RISC CPU,CPU在進行運算時實際是不能直接針對記憶體,即實際CPU是不能直接對全域性變數和儲存在堆疊之上的區域性變數進行運算。這必須透過RISC的Load和Store機制,即CPU需要的變數必須先裝在在暫存器,運算完成再放回記憶體(可以參考:See MIPS run)。

    另外,除系統級程式設計(如訪問的資料是在某個外設上,nonecache),程式本身不會理會Cache,Cache只是為了加快程式對記憶體的訪問 ---- 即常規應用下,軟體是不知道Cache這件事(當然編譯器有些時候因為效率問題要考慮)。

    當然這個問題我的理解根本就扯不上什麼虛擬地址和Page的關係,與Heap和Stack的分配有一點關係:只是多數malloc和new從heap分配,但並不絕對:您可以過載new。看到扯到Page和缺頁中斷也是醉了 ----- 把OS一些概念拿來解這個問題也是一種水平,況且不是隻有Linux呀,並非所有系統都使用分頁概念,還有分段概念呢,也有很多幹脆兩個概念都不要的,如RTOS。即使分頁系統,也未必有處理缺頁中斷:這是作業系統決定的,Minix就沒有,而曬出的那張圖是針對Linux這樣的分頁系統,對於分段系統未必正確。但所有這些和這題有多大關係?

  • 中秋節和大豐收的關聯?
  • 讚美鴿子的詩詞?