對定義區域性變數位置的思考

2021-08-07 03:22:25 字數 941 閱讀 3332

c89規定,在任何執行語句之前,在塊的開頭宣告所有區域性變數。在c99以及c++中則沒有這個限制,即在首次使用之前,可在塊的任何位置都可以宣告變數。另一方面,編譯器不同也不同,gcc編譯器有很多擴充套件的功能,可完美支援c99標準。

所以在gcc編譯下區域性變數並不是一定要定義在**塊的開始位置,可以如下進行定義。

#include void test(void *arg)

int main(int argc, char *argv)

int ss = 6;

return 0;

}

今天經過實踐發現,其實在**塊中定義的區域性變數除非不可避免,否則盡量不要使用這種方式,原因如下:

在**執行到main中的時候dd和c的記憶體空間是沒有進行分配的,之後當進入到第17行才會進行分配。所以在執行第17行的時候會對棧進行一次操作,如果,這個**塊是在乙個迴圈中的話,對棧的操作就更加頻繁了。雖說不會嚴重影響效能,但是能快一分是一分嘛。

使用gdb除錯的 info locals命令可以清楚的看到這個現象。

就使用上面的例子來看,在main入口處打乙個斷點,然後可以看到如下的現象

可以看到這個函式塊中的所有變數的記憶體都已經在棧記憶體裡分配出來了,但是並沒有進行賦值,應該是執行到具體的**位置時才進行具體數值的賦值操作。現在要注意16行到19行的dd和c的兩個變數是沒有任何顯示的。

當程式執行到17行的時候再看一下當前所有區域性變數的資訊如下:

可以找到**塊中dd和c了。因為區域性變數肯定是在棧中分配記憶體,所有這個過程就涉及到了棧記憶體與變數的對映關係,其實就是對棧進行了操作。

關於成員變數和區域性變數儲存位置

成員變數在堆記憶體裡,區域性變數在棧記憶體裡。基礎型別 我有疑惑 既然成員變數存在於物件中,物件存在於堆中,所以成員變數存在於堆中。那麼按照這樣的推理,區域性變數存在於方法中,而方法存在於物件中,物件存在於堆中,那是不是可以說區域性變數存在於堆中?解決思想 當物件new出來,實體存在於堆,物件的成員...

全域性變數 區域性變數在記憶體中的位置

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

MySQL對使用者變數 系統變數 區域性變數詳解

目錄 1 變數分類 1.1 使用者變數 1.1.1 使用者變數定義 1.1.2 使用者變數操作 1.2 系統變數 1.2.1 系統變數定義 1.2.2 系統變數操作 1.3 區域性變數 1.3.1 區域性變數定義 1.3.2 賦值 mysql資料庫中的變數分為mysql系統變數和mysql使用者變數...