程式語言中的變數名到底是什麼?

時間 2021-10-15 15:55:50

1樓:逝者言說人

變數名相當於記憶體位址。

變數名編譯後是靜態邏輯位址。

正常情況下,程式中用到的大多數變數都是區域性變數,它們的儲存空間是執行時動態在中分配,具體是在棧裡分配還是在堆裡分配由編譯器決定。

一般來說只有全域性變數、靜態變數、常量有可能會在編譯期就確定其位址。當然具體情況要分語言,不同語言的概念不太一樣。

對於C/C++ 來說,通常 malloc/new 的就是堆分配,函式臨時變數就是棧分配。所以C/C++有一條金科玉律就是:函式不能把區域性變數位址暴露給外部。

因為一旦函式返回,棧幀被釋放,區域性變數就都沒了。

圖中語言是go,go編譯器是帶逃逸分析的,通俗來說就是如果編譯器認為乙個函式中的臨時變數有可能在本次函式返回之後還繼續被使用,那麼這個臨時變數就會在堆裡分配,否則就在棧裡分配。有了逃逸分析,就不會出現把區域性變數位址暴露給外部使用導致野指標的問題。

就圖中情況來說,因為使用了log包,呼叫時傳入了num的位址,所以這個變數在堆中分配,每次執行變數定義的語句時,其實就是執行了一次 new object 方法。

2樓:

有探索精神好事啊,就是要注意正確的探索方法很多無法理解的東西,一看彙編,一目了然。彙編就是給原始碼脫了衣服對於Go語言的這種Plan9彙編,我也不熟悉,不過有點彙編基礎應該也能看點東西,很明顯number變數是動態分配的記憶體,並不是棧記憶體,這應該是基於記憶體逃逸分析的結果

所以,你理解也沒錯,按照C語言的說法,變數就是符號,所謂符號就代表記憶體位址,把變數理解成位址也沒問題。問題就是,要搞清楚,這個位址在記憶體哪個區

js 漢字作為物件的屬性名或者變數名有什麼隱患

中英文大小寫的符號輸入是不同的。在英文下就不用來回切換了。並且中文做變數,隱患是沒有的,但是怎麼看怎麼怪,強迫症是接受不了的。 悠揚小Q 一毛錢的隱患都沒有。但這並不代表就是贊同,不過這是個好機會,你可以大膽放心並放肆的跟他去撕逼,而且你還占有絕對的上風 你丫給我一中文當做key,我去你大爺。新手嗎...

Java的程式設計思想 物件導向,物件到底是什麼?

啊強啊 這個,可以這樣理解 你現在餓了,想要吃飯,面向過程的角度就是你自己去生火做飯炒菜 然後在物件導向的角度就是你拿出手機叫了乙個外賣,意思就是把做飯的整個過程交給了其他的物件去處理,你只需要去呼叫做飯這個方法就能夠幫你把飯做好了返回給你 類是對現實世界的抽象,物件是對類的例項化!如何理解類 就拿...

請問c語言中的 的返回值是什麼?

暮無井見鈴 一段時間內 都是。至少在 C99 C17 中,true 就是 int 型別的 1 不過在 C23 1 中改掉了。true 變成了 Bool 1u 型別變成了 Bool 而在預處理環境中表現為無符號整數。 邱昊宇 是 int 型的 0 或者 1 The equal to and not e...