D 語言的變數生命週期

2021-05-10 00:17:44 字數 711 閱讀 3606

對於編寫應用的 c++ 程式設計師,生命週期 (lifecycle) 恐怕是所有需要注意的事項裡面最討厭,最容易導致錯誤,而且出錯後後果最嚴重的乙個了。

d 作為 c++ 的改進者,在生命週期上有了不少改進,不幸的是其中一些改進可能是違反 c++ 程式設計師直覺的,下面列出一些常見差異。

struct 和 class

在 c++ 裡,struct 跟 class 沒有本質區別。而 d 的 struct 卻不然,它更像是 c# 的 struct 而不是 c++ 的。在 d 中,struct 是值型別 (value type),而 class 是引用型別 (reference type)。這種區別決定了他們在記憶體中的分配方式不同。

上面的**,在 c++ 和 d 中的意思是一樣的,a1 是乙個分配在棧上的物件,而 pa 指向乙個分配在堆上的物件。但如果是 class:

且不說 c++ 不會接受 a3,它們的意思也和 c++ 程式設計師可能想到的大不相同:

scope 是 d 語言提供 raii 語義的方式,儘管這裡有 new 字,但 scope 決定了 a3 所指向的物件是分配在棧上的,因此當函式返回時,會被立即銷毀。

再強調一下,scope 變數是分配在棧上的,這不僅意味著它有可確定的生命週期,而且意味著建立它不需要昂貴的動態記憶體分配,所以就像在 c++ 中我們應該盡可能多的採用棧物件,在 d 中我們應該盡可能多的採用 scope 物件

變數的生命週期

from 今天在論壇上看到有朋友發帖問道 既然靜態全域性變數與全域性變數都儲存在全域性資料區,為什麼作用域卻不一樣呢?也許答案非常簡單 c 就是這麼規定的,靜態全域性變數與全域性變數的唯一區別就是作用域不同。對乙個c 變數來說,有兩個屬性非常重要 作用域和生命週期,它們從兩個不同的維度描述了乙個變數...

變數的生命週期

1 全域性變數 作用域 全域性作用域 只需要在乙個原始檔中定義,就可以作用於所有的原始檔 生命週期 程式執行期一直存在 記憶體分布 全域性 靜態儲存區 注意 如果再兩個檔案中都定義了相同名字的全域性變數,則連線錯誤 變數重定義。2 全域性靜態變數 生命週期 程式執行期一直存在 作用域 檔案作用域 只...

《C語言筆記 變數的生命週期》

一,棧變數的生命週期 1,區域性變數儲存在棧上,生命週期是臨時的。從定義變數處誕生到變數最近的 處消亡。2,比如乙個函式內定義的區域性變數,在這個函式的每一次呼叫時都會被建立一次,然後使用,最後在函式返回時消亡。二,堆變數的生命週期 1,堆空間是客觀存在的,是由作業系統維護的。程式只是申請然後使用後...