GCC 6 即將帶來的新特性

oschina發表於2016-03-13

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 前端簡單的情況。

當然,你可以找到和嘗試更多的優化和修正。我甚至不會試圖列舉所有發生在這個空間。這與以前的釋出一樣,只要我們可以,我們將盡可能的提高所產生的程式碼和修復更多報告的錯誤。

相關文章