Swift 5將強制執行記憶體獨佔訪問
Swift 5將帶來改進的Swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和Swift編譯器本身都有重要影響。
Swift 5將帶來改進的Swift程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和Swift編譯器本身都有重要影響。
在多種情況下會發生獨佔記憶體訪問問題。編譯器可以靜態地捕獲大部分問題,剩下的只能在執行時處理。只能在執行時處理的問題包括具有轉義閉包、類型別屬性、靜態屬性和全域性變數的排他性違規。
為了更好地說明這個問題,我們可以考慮一個相當普遍的情況:修改一個函式的inout變數,這個函式執行了一個閉包,這個閉包使用同一作用域內的兩個不同的名稱訪問上述的變數:
func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) { modifier(\u0026amp;value) modifier(\u0026amp;value)}func testCount() { var count = 1 modifyTwice(\u0026amp;count) { $0 += count } print(count)}
在這個例子中,因為使用count同時作為modifyTwice和modifier的inout引數,所以出現了問題。我們不清楚print語句應該列印出什麼內容。第一次count變數遞增,它的值遞增到2。但是,當執行第二次加法時,要新增到$0的count值是多少?這可能取決於很多因素,因為記憶體操作不一定是瞬時的。更糟糕的是,編譯器可能會引入優化,進一步使這種情況複雜化。
這個問題不僅與通過不同變數名同時修改記憶體的不可預測性有關,也與編譯器的複雜性有關。
這可能會導致意外和混亂的結果。它還導致編譯器和標準庫的實現具有很大的保守性,它們通常必須確保程式的基本可靠性(沒有崩潰或未定義的行為),即使是在不尋常的情況下。
所有這些意味著如果發現獨佔訪問衝突,使用Swift 5編譯器編譯的應用程式將在執行時崩潰。這個行為以前在Swift 4編譯器除錯模式下可用,因此,僅在執行時模式下測試過的程式在使用Swift 5編譯時有崩潰的風險。
Swift 4編譯器可用,因此僅在執行時模式下測試的程式在使用Swift 5編譯時可能會崩潰。
修復訪問獨佔違規的一般方法是複製資料。在我們的示例中,這將歸結為:
func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) { modifier(\u0026amp;value) modifier(\u0026amp;value)}func testCount() { var count = 1 let increment = count modifyTwice(\u0026amp;count) { $0 += increment } print(count)}
實際上,訪問獨佔違規檢查可能會被禁用,但強烈建議不要這樣做:
雖然禁用執行時檢查可能可以解決效能問題,但這並不意味著獨佔違規是安全的。如果沒有啟用強制執行,程式設計師必須遵守獨佔規則。
檢視英文原文:
https://www.infoq.com/news/2019/02/swift-5-exclusive-memory-access
相關文章
- Swift 5強制獨佔記憶體Swift記憶體
- mysql執行緒獨佔記憶體引數MySql執行緒記憶體
- Java程式執行記憶體機制Java記憶體
- MySQL記憶體執行緒獨享使用的方法MySql記憶體執行緒
- 記憶體訪問全過程記憶體
- c語言強制記憶體轉化引發的問題C語言記憶體
- PS5 獨佔遊戲《Returnal》開發者訪談遊戲
- filebeat實踐-記憶體佔用-最大記憶體佔用記憶體
- VB也能訪問記憶體 (轉)記憶體
- Windbg分析高記憶體佔用問題記憶體
- win10開機記憶體佔用60%怎麼辦 解決開機執行記憶體佔用率過高的方法Win10記憶體
- 自動記憶體管理機制_執行時資料區域記憶體
- Java 執行緒記憶體模型Java執行緒記憶體模型
- 設定SQLserver執行記憶體SQLServer記憶體
- 利用Windbg分析高記憶體佔用問題記憶體
- 深入js基礎:從記憶體機制、解析機制到執行機制(長文預警)JS記憶體
- 測量Linux程式執行時間和佔用記憶體的方法Linux記憶體
- 執行緒通訊機制:共享記憶體 VS 訊息傳遞執行緒記憶體
- win10執行記憶體多大才夠用?windows10需要多大執行記憶體Win10記憶體Windows
- JVM執行緒和記憶體溢位問題排查思路JVM執行緒記憶體溢位
- 深入理解Java的堆記憶體和執行緒記憶體Java記憶體執行緒
- Java多執行緒記憶體模型Java執行緒記憶體模型
- Keep小表到記憶體,提高訪問速度記憶體
- 一個SMMU記憶體訪問異常的問題記憶體
- 關於SQL Server的記憶體佔用問題SQLServer記憶體
- 關於JProfiler監測記憶體佔用問題!!記憶體
- Chrome 再次最佳化記憶體佔用問題,新增記憶體釋放開關Chrome記憶體
- macOS Monterey新問題:“記憶體洩漏”,應用後臺執行消耗上百 GB 記憶體Mac記憶體
- 修改oracle記憶體佔用Oracle記憶體
- 資源記憶體佔用記憶體
- JavaScript 記憶體機制JavaScript記憶體
- ASH記憶體強制Flush日誌解決一例記憶體
- 關於java記憶體訪問重排序的思考Java記憶體排序
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- Java 執行時的記憶體劃分Java記憶體
- 記憶體池、程式池、執行緒池記憶體執行緒
- sqlserver執行時記憶體設定方法SQLServer記憶體
- Tomcat執行時報記憶體溢位Tomcat記憶體溢位