首頁  >  文章  >  後端開發  >  從Go語言角度淺談記憶體分配

從Go語言角度淺談記憶體分配

Go语言进阶学习
Go语言进阶学习轉載
2023-07-24 15:45:17472瀏覽

#為什麼要學習C語言

#嗯,,,今年是2023年,如果從目前的各種開發項目中開說,C語言的確是用的很少,除了嵌入式等一些一定領域,基本很少能見到C的蹤影了,但是為什麼還是一直能聽到xx說要學好C語言呢?

#按照我的理解,其實學習C語言,學的並不是這個語言,而是這個語言背後所代表的一些東西,代表的一些設計,代表的一些本質。


C語言學的好,究竟會帶來什麼優勢

相信不少萌新在群組裡可能聽到某個大佬說,我一星期學完了xx語言,然後直接上手幹活,然後你默默的說了一句,裝13,也可能,你們就在群裡直接槓起來了。

那麼,真的可以說,一周,或是兩週時間,學會一門語言嗎?。

我可以負責任的,告訴你,絕對沒問題,但需要建立在強大的基礎上。

而指針,是特別重要的基礎,現在不管哪個語言,其實本質都是指針的應用,只不過是封裝的簡單了而已。

但是這造成的就是根基如果不穩,就會造成一些莫名奇妙並且不懂的問題,尤其是對萌新來說。

所以,不管現在不管在任何階段,沒有學習C語言的一定要學C,撿起曾經丟下的重要的基礎。

那麼,就先聽我簡單的入門吧。


所需的技術堆疊

本次使用的技術堆疊是Go語言,理論來說是用C語言的,但是因為在指針這一塊入門時,Go和C的本質基本上一樣,所以就採用更人性化的Go語言。

後期會在加上Python,和Go對比一下,區別在哪,看看燒了一把火的Python是如何分配記憶體的。

目前,在看這篇文章時,我還是建議小夥伴有一定基礎的,至少能看懂怎麼定義變數啥的都行。


作業系統各硬體的關係

首先,我們需要了解一下計算機主要組成部分。

首先,簡單的說,至少由CPU  記憶體列  硬碟   #顯示器  #作業系統(Linux,Windowns)等。

那麼這些硬體是如何互相配合的呢。

從Go語言角度淺談記憶體分配

嗯...大概是這樣子的,有點醜。



簡而言之就是:

  1. 系統上的每個應用程式(qq,微信,等)想要讓電腦播放音樂了,顯示器顯示個東西了,像硬碟寫入個檔案了,都需要經過作業系統的同意。

  2. 作業系統呼叫CPU完成指令的執行,CPU將開啟的應用程式讀取到記憶體條中,所以,為什麼原來在機械硬碟會那麼卡,機械太慢了,現在的固態咻咻咻的就完成了硬碟資料到記憶體資料的轉移。

  3. CPU分析讀取到記憶體條中的應用數據,如果是CPU處理的數據,自己拿走計算,如果是顯示卡處理的數據,調用給顯示卡計算,如果是聲音數據,給聲卡計算,等。

  4. 透過以上協調,整個應用程式基本上就能跑起來了,如果需要將資料寫入硬碟,CPU在將記憶體條中的寫入硬碟就行了。

好嘞,透過上述,我們基本上可以了解到作業系統和各硬體的協調關係。

悄悄的說個秘密咯,我們寫的程式碼,基本上都是運行在記憶體中的呢,同理,上述所說的應用,基本上也是將應用的程式碼跑在記憶體中的。


記憶體符號

沒錯,就是這玩意,記憶體條。

從Go語言角度淺談記憶體分配

同理,我還可以這樣理解記憶體條內部的結構。

我們可以將記憶體條理解成一個個房子,就像這樣。

從Go語言角度淺談記憶體分配

還是很醜...

但是我們的記憶體條是有的座標的,也叫#,每個小格子放著一個個的值。

從Go語言角度淺談記憶體分配

但是通常情況下,我們都是平面圖理解的,就像這樣。

位址(座標)一般以十六進位表示,值該是啥就是傻。

從Go語言角度淺談記憶體分配

#

程式碼簡述

我們來看一段非常短Go的程式碼。

宣告一個age變數且賦值為18,且輸出。

package main


import "fmt"


func main() {
    var age int = 18
    fmt.Println("我今年:",age,"岁")
}

在記憶體中如何表示。

從Go語言角度淺談記憶體分配

我們的變數名稱age指向了##0x1001位址,並且輸出了0x0001儲存的值。

就像這樣。

從Go語言角度淺談記憶體分配

#:#一定要理解這句話,變數名稱指向的就是記憶體列上的地址。
#

上述age指向就是位址0x1001#。

但我們在fmt.Println("我今年:",age,"歲")列印時,我們印出的是位址裡面的##。

同理,我們在賦值,交換變數時,還是#是位址裡面的

例如:

從Go語言角度淺談記憶體分配

從Go語言角度淺談記憶體分配

上述程式碼記憶體分配圖。

從Go語言角度淺談記憶體分配

#######

age2會重新申請一個位址儲存age的值18。

可能有時候可能會有人問,星期八,有沒有這種情況,他倆同時指向一個內存,這種不是更省內存嘛。

從Go語言角度淺談記憶體分配

結果:當然會,這種情況,我們後面會講到的,現在能看懂就行,一步一步來。


結論

變數名稱指向的是記憶體位址

我們在賦值時,或列印等操作變數時,操作的是位址上面的值


結尾

上述已經很長了可能你們有點暈了,這篇就到此為止了。

如果在操作過程中有任務問題,記得下面留言,我們看到會第一時間解決問題。

我是碼農星期八,如果覺得還不錯,記得動手按讚以下哈。

感謝你的觀看。

如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。

用微笑告訴別人,今天的我比昨天強,今後也一樣。

如果你覺得文章還可以,記得按讚留言支持我們哈。感謝你的閱讀,有問題請記得在下方留言噢~

想學習更多關於Python的知識,可以參考學習網址:http://pdcfighting.com/,點擊讀原文,可以直達噢~

#########################

-------- --------##-----# --- # End ------ ------------

#---

--從Go語言角度淺談記憶體分配

從Go語言角度淺談記憶體分配

#歡迎大家點贊,

留言,轉發,轉載,感謝大家的相伴與支持

# #想加入Go學習群組請在後台回覆【入群組

#萬水千山總是情,點個【
在看
】行不行
############################ ##

以上是從Go語言角度淺談記憶體分配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Go语言进阶学习。如有侵權,請聯絡admin@php.cn刪除