熱點技術:GCC6 即將帶來的新特性
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 前端簡單的情況。
當然,你可以找到和嘗試更多的優化和修正。我甚至不會試圖枚舉所有發生在這個空間。這與以前的發布一樣,只要我們可以,我們將盡可能的提高所產生的代碼和修復更多報告的錯誤。