《計算機-堆和棧的概念》

1、百度鏈接:https://baike.baidu.com/item/%E5%A0%86%E6%A0%88/1682032?fr=aladdin
2、php中的概念:http://baijiahao.baidu.com/s?id=1600853651477190798&wfr=spider&for=pc
關於PHP語言在內存中的分配(堆和棧的區別)

一點PHP

18-05-1909:24
分享關於編程中的數據在內存裏的存儲方式,本文以PHP語言爲例來分析計算機中各段存儲區的區別,代碼段、堆空間段、代碼段、初始化靜態常量段。

在PHP中共有8種數據類型,其中4中標量類型(字符串、布爾型、整型、浮點型)、2種複合類型(對象、數組)、2種特殊類型(資源、NULL)。他們在運行的時候都要加載到內存中去用,那麼在內存裏面它們是怎麼表示的呢?

初始化靜態常量段:通常是指用來存放程序中已初始化且不爲0的全局變量如:靜態變量和常量。

代碼段:通常是指用來存放程序執行代碼的一塊內存區域,比如函數和方法。

棧空間段:是存儲佔用相同空間長度並且佔用空間小的數據類型的地方,比如說整型1,10,100,1000,10000,100000 等等,在內存裏面佔用空間是等長的,都是64 位4 個字節。存儲的都是局部變量,凡是定義在方法中的都是局部變量(方法外的是全局變量),變量有自己的作用域,一旦離開作用域,變量就會被釋放。棧內存的更新速度很快,因爲局部變量的生命週期都很短。所以在棧空間的數據都是可以通過代碼手動進行釋放。

棧內存段:數據長度不定長,而且佔有空間很大的數據類型的數據。在堆內存是裏是不可以直接存取的內存,堆內存存儲的是數組和對象(其實數組就是對象)。凡是new建立的都是在堆中,堆中存放的都是實體(對象),實體用於封裝數據,而且是封裝多個(實體的多個屬性),如果一個數據消失,這個實體也沒有消失,還可以用,所以堆是不會隨時釋放的,但是棧不一樣,棧裏存放的都是單個變量,變量被釋放了,那就沒有了。堆裏的實體雖然不會被釋放,但是會被當成垃圾,最後通過垃圾回收機制去實現垃圾回收。對於我們的對象來數就是一種大的數據類型而且是佔用空間不定長的類型,所以說對象是放在堆裏面的,但對象名稱是放在棧裏面的,這樣通過對象名稱就可以使用對象。

$p1=newPerson();

對於這個條代碼,$p1 是對象名稱在棧內存裏面new Person()是真正的對象是在堆內存 裏面的,具體的請看下圖:

從上圖可以看出$p1=new Person();等號右邊是真正的對象實例,在堆內存裏面的實體, 上圖一共有3 次new Person(),所以會在堆裏面開闢3 個空間,產生3 個實例對象,每個對象之間都是相互獨立的,使用自己的空間,在PHP 裏面,只要有一個new 這個關鍵字出現就會 實例化出來一個對象,在堆裏面開闢一塊自己的空間。 每個在堆裏面的實例對象是存儲屬性的,比如說,現在堆裏面的實例對象裏面都存有姓 名、性別和年齡。每個屬性又都有一個地址。 p1=newPerson();p1=new Person();等號的右邊p1 是一個引用變量,通過賦值運算符“=”把對象的首地址 賦給“p1p1”這個引用變量,所以p1 是存儲對象首地址的變量,p1p1 放在棧內存裏邊,p1 相當 於一個指針指向堆裏面的對象,所以我們可以通過$p1 這個引用變量來操作對象,通常我們也 稱對象引用爲對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章