這應該是區域跟全域的觀念搞不清楚
glocal.c
------------------
int a;
編譯結果
.file "global.c"
.comm a,4,4
.ident "GCC: (Debian 4.6.1-4) 4.6.1"
.section .note.GNU-stack,"",@progbits
local.c
------------------
void x(){int a;}
編譯結果
.file "local.c"
.text
.globl x
.type x, @function
x:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size x, .-x
.ident "GCC: (Debian 4.6.1-4) 4.6.1"
.section .note.GNU-stack,"",@progbits
用黃色標出來的,就是在組合語言看到把空間要出來的部分 ...
可以看到,區域變數都是用 rsp 搞出來的,每當程式執行到那個 scope,就會去找 rsp 挖洞
※ 引述《amozartea (單車單車)》之銘言:
: 如題,這可能很少人問過
: 書上寫說區域變數其實都自動預設auto,
: 在編譯過程中並不會配置一塊記憶體空間,而是在程式執行時以堆疊的方式存放,
: 因此他是屬於動態的變數。
: ^^^^^^^^^^^^^^^^^^^^^^ 此段是出自洪維恩的書
: 但是又在動態記憶體章節上面寫說C++都是預設靜態什麼的 很讓人搞混
: ok 總之我目前的認知是一般的陣列是靜態宣告...
: (以下都是區域變數)
: int a; 跟 auto int a; 等價,而且這是動態
: int a[5]; 是靜態,,,應該吧?
: 那假設我宣告如下(當然是區域):
: auto int a[5]; 這到底該算靜態還是動態? 已經試過編譯可以過...
: 如果是靜態那不是表示auto關鍵字在這裡沒用嗎@@?
: 如果是動態的話那跟
: int* a; a = new int[5];又有何不同
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.46
※ 編輯: meconin 來自: 140.112.30.46 (01/19 18:30)
※ 編輯: meconin 來自: 140.112.30.46 (01/19 18:32)