GCC 6 即將帶來的新特性
GCC專案在每年的三/四月份都會作出重大更新。三月即將到來,GCC專案的工程師們正忙著GCC 6的釋出。我將在百忙之中抽出一點時間,簡短地談論一些GCC 6的新特性。
警告
GCC力圖實現一些警告,這些警告可以幫助開發者在編譯時發現錯誤,而不是讓潛在的危險程式碼被默默接受並最終部署。對於 GCC 6,主要增加的是警告如下:
誤導性的縮排:對誤導性縮排進行警告的目的是檢測出程式碼結構中與人類理解不相符的程式碼塊。最明顯的例子就是2014年的“Apple SSL”bug,不恰當的縮排看上去是將GOTO語句放在了IF條件語句裡面,而實際上呢並沒有放在IF的判斷分支內。更多的細節見David Malcolm的一篇部落格。
同值比較:程式碼中將一個物件跟它自己比較或者跟始終與同一值比較的情況,通常是程式碼中的筆誤。GCC 6將對這種比較進行警告。
重複的條件:GCC 6將對IF-ELSE-IF比較鏈中重複的條件進行警告。
負移位值和移位溢位: GCC現在將對左移一個負值或者左移溢位進行警告。這種行為通常會導致未定義的結果,相比於執行時產生未定義結果,在編譯時就報出警告是更明智的選擇。
空引用:GCC更積極的檢測那些由於空指標引用或者返回空值引起錯誤和未定義行為的邏輯路徑,或者將空值賦給明確要求非空的函式引數的情況。
特性
每一個版本的gcc都會帶來各種新的特性,這些新特性讓使用GCC開發變得更加容易。即將到來的GCC 6版本的亮點包括:
OpenMP 4.5:OpenMP API提供了一組簡單、但高度靈活的介面來開發並行C、C++和Fortran程式。2015年11月釋出了OpenMP 4.5規範,該規範在現有的OpenMP4.0基礎上有了很多改進。GCC 6將為C和C++提供OpenMP 4.5的支援,對Fortran提供OpenMP 4支援以及對offloading一定程度的支援,尤其對於Intel MIC處理器。
段暫存器支援: x86/x86_64是一個分段的記憶體架構,但是GCC很大程度上忽略了Intel架構這方面的特性,而是依靠隱含的段暫存器。底層程式碼比如linux核心或者glibc通常必須意識到分段體系結構,傳統上採用彙編語句進行顯式的段暫存器操作。從GCC 6起,變數在宣告時就可以指定到特殊的段,使用這些記憶體中變數時顯式的段暫存器就會被操作。
增強位置和其他診斷工作:GCC 6的診斷機制引入了“增強位置”特性。這個特性允許CC跟蹤一定範圍的診斷資訊,而不僅僅是單個點。舉個例子,一個複雜表示式中的有疑問的子表示式可以被識別出來並向開發人員強調。診斷現在也包括“修復”性提示,建議開發者如何修改錯誤的程式碼。這個特性將會在David Malcolm的另一篇部落格中詳細介紹。
目標克隆:GCC6 增加了一個新的“目標克隆”屬性,用於指明特定函式需為不同的ISA變數進行多次編譯,並建立程式分發器來檢測這些正在使用中的ISA並呼叫適合的克隆。這使得對ISA的不同版本提供”特殊執行”程式支援更為容易。
擴充套件存數規則:GCC6 新增一個新的pragma“scalar_storage_order”,用於指定在一個結構內欄位的位元組順序。如果目標的位元組順序不同於正在被訪問的物件的位元組順序,GCC6會自動生成程式碼來按需byte交換這些物件。
解除安裝/HSA:GCC5 最初已經支援通過OpenMP來解除安裝到MIC,通過OpenACC解除安裝到Nvidia GPUS. GCC6改進了這些效能並新增了通過HSA加速器來解除安裝。
語言和執行時
GCC 6 現在的預設值是 C++ 14. GCC 6 現在包括 C++ Concepts.
C++執行時庫現在支援特殊的數學函式 (ISO/IEC 29124:2010)
支援 C++17 的實驗功能
std::uncaught_exceptions
unique_key maps 的 try_emplace 和 insert_or_assign
用於訪問容器和陣列的非成員函式 std::size, std::empty 和 std::data
std::invoke
std::shared_mutex
std::void_t 和 std::bool_constant
實驗性的支援檔案系統技術規範
實驗支援大多數圖書館基本技術規範,包括 shared_ptr 多型性記憶體資源和陣列支援第二個版本
矩陣相乘的 intrinsic 現在內聯在 Fortran 前端簡單的情況。
當然,你可以找到和嘗試更多的優化和修正。我甚至不會試圖列舉所有發生在這個空間。這與以前的釋出一樣,只要我們可以,我們將盡可能的提高所產生的程式碼和修復更多報告的錯誤。
相關文章
- 官方解讀:TensorFlow 2.0中即將到來的所有新特性
- JDK 16 即將釋出,新特性速覽!JDK
- .NET 5 帶來的新特性 [MemberNotNull] 與 [MemberNotNullWhen]Null
- Java 14 可能帶來什麼新特性?Java
- 學Java的同學看過來,JDK13即將釋出,新特性會是什麼?JavaJDK
- 即將釋出的ionic4有哪些激動人心的新特性
- SafeTitan歸來:新的加密貨幣ICO即將釋出加密
- 即將到來的 Debian 10 Buster 釋出版的新特點
- Go 1.18 中即將出現的功能特性Go
- 即將推出的 chrome 95 新特性❗ 從中我們能學到什麼❓Chrome
- 5G時代即將到來,帶來的遠遠不止網速的提高
- JavaScript 6 的新特性介紹JavaScript
- ES6新特性
- 帶你總結ES6的特性
- RxJS 5.5: 即將到來的 pipelineJS
- 歐盟即將生效的數字法案,將給遊戲行業帶來哪些衝擊?遊戲行業
- Flutter 1.17版本釋出,帶來多個新特性Flutter
- 鐵威馬TOS 6即將上線,重塑NAS新紀元,友好美觀引領未來
- 暴雪持有了新域名:暗示著《暗黑4》即將到來?
- 因為我的一次疏忽而帶來的golang1.23新特性Golang
- 帶你一起敲敲ES6的新特性,邊解釋邊應用!
- Superedge的新特性和未來之路
- ES6新特性總結
- 玩轉ES6新特性
- ES6 新特性之SymbolSymbol
- ES 6新特性(Day07)
- 前端-JavaScript新特性(ES6)前端JavaScript
- Surface Pro 8新特性開始曝光,微軟Surface Pro 7即將上市開售微軟
- SQL Server 2008資料複製新特性及其帶來的價值(下)XDSQLServer
- Unix 即將迎來 50 歲
- Silverlight5即將來臨
- OpenAI CEO Sam Altman:AI革命即將到來,我們需要新的系統OpenAI
- ES6中let 和 const 的新特性
- ES6中的新特性:Iterables和iterators
- [翻譯]看看即將到來的 Laravel 10Laravel
- Win10系統微軟商店即將迎來更新:帶來遠端安裝新功能Win10微軟
- 創意AI將給電子遊戲帶來怎樣的創新?AI遊戲
- 使用ES6的新特性Proxy來實現一個資料繫結例項
- 將 Sidecar 容器帶入新的階段IDE