原文
1,已棄用遺漏沖突的extern (D) @system
函數定義同一
模塊中多個
函數的定義,在DMD 2.095.0
后已算錯誤.
但是,盡管有同樣混雜
,兩個實現顯式
的和推導
的@系統
屬性有區別時,編譯器不發出錯誤.
void foo() {}
void foo() @system {} //無錯誤
現在已修復.如果有沖突@系統
實現,現在發出棄用
警告.
從DMD2.112
開始,與其他模塊內函數
類型沖突一樣,產生多個
定義錯誤.
2,在重載集
上棄用
調用__traits(getAttributes)
在此版本之前,__traits(getAttributes)
可在單個函數和重載集
上同時調用.但是后者,編譯器只
為第一個詞法定義
的函數收集
.此行為易錯
.考慮:
module test;
@("gigi")
void fun() {}
@("mimi")
void fun(int) {}
void main()
{static foreach(attr; __traits(getAttributes, fun))
pragma(msg, attr);
盡管未指示實際查詢
重載,上面代碼打印"gigi"
.總是選擇第一個
重載.
從本版開始
,棄用__traits(getAttributes)
的該用法.如果要處理指定重載,可結合使用__traits(getOverloads)
和__traits(getAttributes)
:
@("gigi")
void fun() {}
@("mimi")
void fun(int) {}
void main()
{static foreach (t; __traits(getOverloads, test, "fun"))
static foreach(attr; __traits(getAttributes, t))
pragma(msg, attr);
//打印
gigi
mimi
3,棄用無效
非空增量語句
該最后for
語句不應產生值.現在檢測并顯示
棄用消息.以下for
語句都會觸發
棄用:
// 無副作用的計算"j"
int j;
for (;; j) {...}
// 不必要的解引用
for (ubyte* sp;; *sp++) {...}
// 第一個句子是塊語句
// 最后句子是函數字面,而不是塊語句
for({j = 2; int d = 3;} j + d< 7; {j++; d++;}) {...}
注意:調用返回空
的函數,即使函數
閑著,也不棄用
.這是模板
代碼.
4,現在可在棧上分配
賦值給域
數組變量
的數組字面.
以前,它們總是與垃集
一起分配,因此在@nogc
中或更好C
代碼不可用
.導致頻繁使用
以下方法:
void main() @nogc
{int[3] buffer = [10, 20, 30];
int[] arr = buffer[];
}
現在可用一行
來寫:
void main() @nogc
{scope int[] arr = [10, 20, 30];
}
具有以下限制
:
1,必須顯式
注解變量域,而不僅是推導
域
2,必須傳遞-preview=dip1000
,以避免在舊代碼中引入內存破壞
.
3,注意,在@系統
及@信任
代碼中,編譯器不會驗證域
變量是否逃逸
.
4,數組字面
必須初化變量.隨后數組字面賦值仍然使用GC
.
5,數組
元素不能有析構器
其中一些限制
可能會在未來取消.
5,靜斷
現在支持多個消息參數
條件
計算結果為假
時,后續式
都轉換
為串
然后連接.生成
的串診斷
與錯誤
一起打印出來.
enum e = 3;
static assert(false, "a = ", e);
打印:
`file.d(2)`:錯誤:靜斷:`a=3`
6,添加-preview=systemVariables
自接受DIP1035
系統變量以來,@safe
代碼無法再訪問
標記為@system
的變量.為了避免代碼中斷
,編譯器從發出
棄用警告開始.預覽開關
會轉換為錯誤
,且在未來
版本默認
啟用.
@system int* p;
struct S
{@system int i;
}
void main() @safe
{int x = *p; // 有開關,算失敗,否則,發出棄用
S s;
s.i = 0; // 同上.
}
注意,目前僅限顯式
標記為@system
的變量,尚未實現基于變量初化器
的推導@system
.
生成Throwable.TraceInfo
,默認值現在是@nogc
的.工作方式:運行時
現在有2個
跟蹤相關函數,一個分配
,另一個
來釋放
跟蹤信息.兩者都通過相同的Runtime.traceHandler
函數來設置的.設置釋放
函數的第二個
參數是可選
的(因此不會影響
現有代碼).
拋Throwable
時,如果尚未
設置跟蹤信息
,運行時用指定
函數來分配
跟蹤信息.如果釋放
函數為非空
,則復制
函數指針到可拋(Throwable)
對象中,并復制到infoDeallocator
新成員中.析構
可拋(Throwable
)時,如果設置了infoDeallocator
成員,則會在info
成員上調用它.
默認分配器和釋放器
現在使用C
的malloc
并自由分配和釋放TraceInfo
.現在除了TraceInfo
對象自身的分配
,幾乎
都已是nogc
了.
好處:
現在可在GC
收集例程
中運行
時生成棧跟蹤
.InvalidMemoryOperationError
現在有棧跟蹤
.
鮮為人知的是,即使在@nogc
函數中,拋Throwable
也是在使用GC
,但現在(默認)不再是這樣.
已修復一些GC
掛起.
可能缺點是,在最終析構Throwable
時釋放TraceInfo
,從而導致
潛在指針懸掛
.如果從Throwable
外復制info
,請確保不要讓它超出可拋(Throwable)
的生命期,或確保設置infoDeallocator
成員為null
.
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文題目:d的102版更改-創新互聯
鏈接分享:http://www.2m8n56k.cn/article38/dghesp.html
成都網站建設公司_創新互聯,為您提供動態網站、網站制作、品牌網站建設、用戶體驗、自適應網站、網站改版
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯