Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

請問stack和heap的觀念

0 views
Skip to first unread message

藍色之星

unread,
Aug 15, 2001, 3:57:13 AM8/15/01
to

請問在一般的程式中
什麼資料會放到stack?
什麼資料會放到heap?
這兩個的觀念和真正會影響程式運作的層面是什麼?

聽說一般compile time的變數都放在stack
而run time產生的變數(用allocate, new)
都放在heap
這種說法對嗎?


謝謝...

--
[1;32m※ Origin: [33m交大資工鳳凰城資訊站 [37m<bbs.csie.nctu.edu.tw> [m
[1;31m◆ From: [36masuka.EE.NCTU.edu.tw [m

藍色之星

unread,
Aug 16, 2001, 12:09:51 AM8/16/01
to
※ 引述《oioo...@bbs.mgt.ncu.edu.tw (我是凱凱)》之銘言:
> ==> polocl...@bbs.tku.edu.tw (Polo) 提到:
> : I think it better say that .
> : the primitive type are stored in the stack, but
> : the Object is live in the heap.
> : the seams is the little lovely reference type that also stay in stack.
> : welcome feedback.
> : polo
> : 《 在 Bluest...@bbs.csie.nctu.edu.tw (藍色之星) 的大作中提到: 》
> : not exactly.
> 非動態的就會在stack
> 動態的東東就在heap
> 不知原作者了解啥是ARI嗎?
> 舉個例你程式A自己遞迴的呼叫自己...那麼有關程式A的資訊(variable,參數
> return address....)都會一直被放在stack上....就像堆盤子一樣....
> 一般程式語言的書有提...應該一般的程式語言都是這樣
> 若有錯請指教^^

謝謝兩位的回答

以下的回答是我轉自programming板另一位 d08001的回答:

> 您的後段說法是正確。
> 前段說法之使用方式就不一定是怎樣才對,要看各家手法....
> Stack: 遞迴、參數傳遞...
> Heap : 單雙向佇列,Pipe,Buffer,IPC,...


這樣子總體而言, 是不是可以如下來解釋:

凡是靜態配置而且是primitive type的variable以及
因為遞迴所需要的return address, 傳遞的參數
會放在stack上

動態配置的變數, 以及一般的物件都是放在heap
(像所提到的queue, pipe, buffer都是class吧?)

但是還有一項比較奇怪: reference
reference不是可以當做變數的別名來看
所以這樣子推算的話, 不就應該要看reference
所指到的物件是那種型態來決定reference所放的地方嗎?

還有就是stack和heap其實都是堆疊的意思
是不是因為某種歷史因素, 所以
用了這兩種名字
所以本意都是暫存變數的一種管理方法, 這樣子說對嗎?

最後想請問的是我看OS的書中寫到
一個管理process的單位是PCB或是TCB(process or task control bar)
其中有存放process id以及其他有關processor的資訊
有一個欄位是stack pointer
這個stack pointer是不是就一個指向前面所說的stack的指標?
為什麼heap不用指? 還是說其實都有指到?
或是其實這兩件事是不一樣的呢?


謝謝各位的回答和討論!

John Lin

unread,
Aug 16, 2001, 2:13:49 AM8/16/01
to
"藍色之星" 撰寫
> ※ 引述《(我是凱凱)》之銘言:
> > ==> (Polo) 提到:

> > : the primitive type are stored in the stack, but

It's nothing to do with "primitive" or "non-primitive".

> > : the Object is live in the heap.

Object can live in stack, too.

> > : the seams is the little lovely reference type that also stay in stack.

Reference can stay in either stack or heap.

> > 非動態的就會在stack
> > 動態的東東就在heap

不對吧?舉個例子
static int i = 3;
這是非動態的對不對,它是在 stack 還是 heap 呢?

> > 舉個例你程式A自己遞迴的呼叫自己...那麼有關程式A的資訊(variable,參數
> > return address....)都會一直被放在stack上....就像堆盤子一樣....
> > 一般程式語言的書有提...應該一般的程式語言都是這樣

補充一下,最早 FORTRAN 的副程式資訊都不是放在 stack 上
所以不支援 recursive 呼叫。後來 Pascal 出來以後才普遍用 stack 的

> 凡是靜態配置而且是primitive type的variable以及
> 因為遞迴所需要的return address, 傳遞的參數會放在stack上

靜態配置:static 或 global 變數是從 heap,auto 變數是從 stack。但都算靜態配置吧

primitive:與 primitive 無關,舉例

static int i = 3; // primitive,在 heap
void function() { int i = 3; } // primitive,在 stack
static struct S s; // non-primitive,在 heap
void function() { struct S s; } // non-primitive,在 stack

遞迴:提到「函數/副程式」就可以了,不限定是遞迴的

補充一下:請想想除了 return address、參數以外,還有什麼會在 stack 上呢?

> 一般的物件都是放在heap

這與語言有關。
如果產生物件一定要動態 (如 Java) 去 new,那麼就是在 heap
但是,例如 C++ 的這個例子

void function() {
Dog d; // 這個 object 是在 stack 上
Dog *p = new Dog(); // 這個 object 本體是在 heap 上,指標在 stack 上
}

> 但是還有一項比較奇怪: reference
> reference不是可以當做變數的別名來看
> 所以這樣子推算的話, 不就應該要看reference
> 所指到的物件是那種型態來決定reference所放的地方嗎?

reference 視同 C/C++ 的 pointer。同上,看它宣告在哪裡、是不是 static 而定

> 還有就是stack和heap其實都是堆疊的意思
> 是不是因為某種歷史因素, 所以用了這兩種名字

heap 有人叫「堆積」。兩個是不一樣的觀念

> 一個管理process的單位是PCB或是TCB(process or task control bar)
> 其中有存放process id以及其他有關processor的資訊
> 有一個欄位是stack pointer
> 這個stack pointer是不是就一個指向前面所說的stack的指標?

應該是

> 為什麼heap不用指? 還是說其實都有指到?

heap 也有它的一套管理副程式。如果您能 trace 一下 LINUX kernel 的
system call "kmalloc" 以及程式庫中 "malloc" 的原始碼,應該就可以了解

John Lin


我是凱凱

unread,
Aug 16, 2001, 2:04:33 AM8/16/01
to
==> Bluest...@bbs.csie.nctu.edu.tw (藍色之星) 提到:
: ※ 引述《oioo...@bbs.mgt.ncu.edu.tw (我是凱凱)》之銘言:
: > 非動態的就會在stack

: > 動態的東東就在heap
: > 不知原作者了解啥是ARI嗎?
: > 舉個例你程式A自己遞迴的呼叫自己...那麼有關程式A的資訊(variable,參數
: > return address....)都會一直被放在stack上....就像堆盤子一樣....
: > 一般程式語言的書有提...應該一般的程式語言都是這樣
: > 若有錯請指教^^
: 謝謝兩位的回答
: 以下的回答是我轉自programming板另一位 d08001的回答:
: > 您的後段說法是正確。
: > 前段說法之使用方式就不一定是怎樣才對,要看各家手法....
: > Stack: 遞迴、參數傳遞...
: > Heap : 單雙向佇列,Pipe,Buffer,IPC,...
: 這樣子總體而言, 是不是可以如下來解釋:
: 凡是靜態配置而且是primitive type的variable以及
: 因為遞迴所需要的return address, 傳遞的參數
: 會放在stack上
: 動態配置的變數, 以及一般的物件都是放在heap
: (像所提到的queue, pipe, buffer都是class吧?)
: 但是還有一項比較奇怪: reference
: reference不是可以當做變數的別名來看
: 所以這樣子推算的話, 不就應該要看reference
: 所指到的物件是那種型態來決定reference所放的地方嗎?
: 還有就是stack和heap其實都是堆疊的意思

: 是不是因為某種歷史因素, 所以
: 用了這兩種名字
: 所以本意都是暫存變數的一種管理方法, 這樣子說對嗎?
: 最後想請問的是我看OS的書中寫到
: 一個管理process的單位是PCB或是TCB(process or task control bar)

: 其中有存放process id以及其他有關processor的資訊
: 有一個欄位是stack pointer
: 這個stack pointer是不是就一個指向前面所說的stack的指標?
: 為什麼heap不用指? 還是說其實都有指到?
: 或是其實這兩件事是不一樣的呢?
: 謝謝各位的回答和討論!


nononononono.............

不是說資料結構為queue等的東西就是會放到heap區,
你的queue也可以用陣列來作ㄚ....如此你宣告一個size固定的陣列
你也可以把他看成是queueㄚ...queue只不過是last in last out而已
所以這樣的queue是非動態的,

還有就是函式執行時會在stack放入該函式的資訊...不一定要遞迴...
隨便舉例如一個程式有三個函式main,B,C
main call B 再 call C那麼這個程式的stack區就是最底層是main再B再C
很重要的一點就是stack區放的不是程式碼而是該函式的資訊而已喔!!!

變數只是函式中的一個東西除非是動態的東西否則都是該函式的資訊而已

stack和heap由OS管理.....理論上一個程式可以有4G的虛擬記憶體(32位元定址)
所以一個程式的stack + heap有4G的空間.....懶的說了

至於stack pointer和heap pointer這在高階語言我們程式都無法存取之
你的恐龍版OS沒看到heap pointer我"猜"應該是heap區都是比較由
OS統一管理,不像stack跟程式比較有關吧

你去翻一下program language的subprogramming implementation
有介紹

--
◎ [1;31m龍 [32m貓 [33m資 [34m訊 [35m天 [36m地 [0m( [1mbbs.mgt.ncu.edu.tw [0m)
◎[ [1;33;46moioo [0m]From: c69.h061013208.is.net.tw

尚未認證通過

unread,
Aug 16, 2001, 9:02:28 AM8/16/01
to

..skip

: static int i = 3;


: 這是非動態的對不對,它是在 stack 還是 heap 呢?
: > > 舉個例你程式A自己遞迴的呼叫自己...那麼有關程式A的資訊(variable,參數
: > > return address....)都會一直被放在stack上....就像堆盤子一樣....
: > > 一般程式語言的書有提...應該一般的程式語言都是這樣
: 補充一下,最早 FORTRAN 的副程式資訊都不是放在 stack 上
: 所以不支援 recursive 呼叫。後來 Pascal 出來以後才普遍用 stack 的
: > 凡是靜態配置而且是primitive type的variable以及
: > 因為遞迴所需要的return address, 傳遞的參數會放在stack上
: 靜態配置:static 或 global 變數是從 heap,auto 變數是從 stack。但都算靜態配置吧

Thankx for correcting .
I am not thinking about tha static varible...
and mostly base on Java language.
but I think. struct type is c/c++ 's particular type.
in fact I really think it's C/C++'s primitive type ..
Java do not have it, but C# grab it back.
( obviously I dont know c/c++ too much... ha )


: primitive:與 primitive 無關,舉例


: static int i = 3; // primitive,在 heap
: void function() { int i = 3; } // primitive,在 stack
: static struct S s; // non-primitive,在 heap
: void function() { struct S s; } // non-primitive,在 stack


: 遞迴:提到「函數/副程式」就可以了,不限定是遞迴的
: 補充一下:請想想除了 return address、參數以外,還有什麼會在 stack 上呢?

as you just mention about , the enumiate , union should also here right ?


I think the point is base on the spec of compiler.

nice chating.

have a nice day
Polo

--

[1;33mMain [1;37m( ICQ:2883897 ) [1;33m{ null }

[0m

[m [1;34m※ 來源:‧蛋捲廣場 bbs.tku.edu.tw‧[FROM: 211.23.191.178] [m

鬼版看完看笑話版

unread,
Aug 16, 2001, 11:43:00 AM8/16/01
to
==> 在 oioo...@bbs.mgt.ncu.edu.tw (我是凱凱) 的文章中提到:

> nononononono.............
> 不是說資料結構為queue等的東西就是會放到heap區,
> 你的queue也可以用陣列來作ㄚ....如此你宣告一個size固定的陣列
> 你也可以把他看成是queueㄚ...queue只不過是last in last out而已
> 所以這樣的queue是非動態的,
> 還有就是函式執行時會在stack放入該函式的資訊...不一定要遞迴...
> 隨便舉例如一個程式有三個函式main,B,C
> main call B 再 call C那麼這個程式的stack區就是最底層是main再B再C
> 很重要的一點就是stack區放的不是程式碼而是該函式的資訊而已喔!!!
> 變數只是函式中的一個東西除非是動態的東西否則都是該函式的資訊而已
> stack和heap由OS管理.....理論上一個程式可以有4G的虛擬記憶體(32位元定址)
stack由OS管理?不是很瞭解...

> 所以一個程式的stack + heap有4G的空間.....懶的說了
> 至於stack pointer和heap pointer這在高階語言我們程式都無法存取之
> 你的恐龍版OS沒看到heap pointer我"猜"應該是heap區都是比較由
^^^^^^sigh...若不是為了研究所考試會考,我覺得
直接看intel x86手冊跟linux kernel src, 會有趣的多...
個人感覺...

> OS統一管理,不像stack跟程式比較有關吧
> 你去翻一下program language的subprogramming implementation
> 有介紹


--
偶速the rock(絕地任務)迷ㄛ... ^_^
--
* Origin: ★ 交通大學資訊科學系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

0 new messages