全域性變數存放位置及執行效率問題

2021-10-08 17:30:06 字數 666 閱讀 7812

最開始我都認為全域性變數和棧一樣,存放在棧裡,執行效率和棧一樣,後面經過測試,才知道全域性變數的執行效率都沒有堆的高,也就是說比棧更差。

對於全域性變數的理解:

1. 全域性變數既不在棧中也不在堆中,而是在全域性區(靜態區) 全域性變數的儲存和靜態變數的儲存是在一起的

(1)初始化的全域性變數和靜態變數在同一塊區域【是在資料段中的】

(2)未初始化的全域性變數、未初始化的靜態變數在相鄰的另外一塊區域內【是在資料段中的bss段:特點是可讀寫;在程式執行前bss段會自動清0】

關於全域性變數執行效率問題

全域性變數a++,區域性變數b++

同樣的賦值,區域性變數只需要一條語句

adds     r4,r4,#1        a數值加1
而全域性變數需要5句,執行過程

ldr      r0,[pc,#24]    執行了載入全域性變數a的位址到通用暫存器r0

ldr      r0,[r0,#0x00]     載入r0位址的資料到r0

adds     r0,r0,#1        r0數值加1

ldr      r1,[pc,#20]     載入a的位址到r1

str      r0,[r1,#0x00]  將r0的資料寫到r1+0為位址的儲存器中

全域性變數,靜態變數以及區域性變數存放位置

一般工程編譯完成後會生成.o 檔案 然後通過link 成乙個完整的映象 可執行程式包括bss段 資料段 段 也稱文字段 bss block started by symbol 通常是指用來存放程式中未初始化的 全域性變數和 靜態變數的一塊記憶體區域。特點是 可讀寫的,在程式執行之前bss段會自動清0...

全域性變數,靜態變數以及區域性變數存放位置

一般工程編譯完成後會生成.o 檔案 然後通過link 成乙個完整的映象 elf 檔案一般包含 一下幾個 段 file header欄位裡存放了描述整個檔案的基本屬性資訊的內容,如程式入口位址,其他各段資訊 偏移量和範圍 text section 主要是編譯後的原始碼指令,是唯讀字段。data sec...

linux 堆 棧 全域性變數存放

在學習 深入理解計算機系統 中鏈結這一章中,資料講乙個可執行檔案包含多個段。在linux系統中 段總是從0x08048000處開始,資料段在接下來的4kb對齊的位址處,執行時堆在接下來的讀寫段之後的第乙個4kb對齊的位址處,並通過呼叫malloc庫網上增長,開始於位址0x40000000處的段是為共...