熱點技術(shù):GCC6 即將帶來的新特性
GCC項目在每年的三/四月份都會作出重大更新。三月即將到來,GCC項目的工程師們正忙著GCC 6的發(fā)布。我將在百忙之中抽出一點時間,簡短地談?wù)撘恍〨CC 6的新特性。
警告
GCC力圖實現(xiàn)一些警告,這些警告可以幫助開發(fā)者在編譯時發(fā)現(xiàn)錯誤,而不是讓潛在的危險代碼被默默接受并最終部署。對于 GCC 6,主要增加的是警告如下:
誤導(dǎo)性的縮進:對誤導(dǎo)性縮進進行警告的目的是檢測出代碼結(jié)構(gòu)中與人類理解不相符的代碼塊。最明顯的例子就是 2014年的“Apple SSL”bug,不恰當(dāng)?shù)目s進看上去是將GOTO語句放在了IF條件語句里面,而實際上呢并沒有放在IF的判斷分支內(nèi)。更多的細節(jié)見David Malcolm的一篇博客。
同值比較:代碼中將一個對象跟它自己比較或者跟始終與同一值比較的情況,通常是代碼中的筆誤。GCC 6將對這種比較進行警告。
重復(fù)的條件:GCC 6將對IF-ELSE-IF比較鏈中重復(fù)的條件進行警告。
負移位值和移位溢出: GCC現(xiàn)在將對左移一個負值或者左移溢出進行警告。這種行為通常會導(dǎo)致未定義的結(jié)果,相比于運行時產(chǎn)生未定義結(jié)果,在編譯時就報出警告是更明智的選擇。
空引用:GCC更積極的檢測那些由于空指針引用或者返回空值引起錯誤和未定義行為的邏輯路徑,或者將空值賦給明確要求非空的函數(shù)參數(shù)的情況。
特性
每一個版本的gcc都會帶來各種新的特性,這些新特性讓使用GCC開發(fā)變得更加容易。即將到來的GCC 6版本的亮點包括:
OpenMP 4.5:OpenMP API提供了一組簡單、但高度靈活的接口來開發(fā)并行C、C++和Fortran程序。2015年11月發(fā)布了OpenMP 4.5規(guī)范,該規(guī)范在現(xiàn)有的OpenMP4.0基礎(chǔ)上有了很多改進。GCC 6將為C和C++提供OpenMP 4.5的支持,對Fortran提供OpenMP 4支持以及對offloading一定程度的支持,尤其對于Intel MIC處理器。
段寄存器支持: x86/x86_64是一個分段的內(nèi)存架構(gòu),但是GCC很大程度上忽略了Intel架構(gòu)這方面的特性,而是依靠隱含的段寄存器。底層代碼比如linux內(nèi) 核或者glibc通常必須意識到分段體系結(jié)構(gòu),傳統(tǒng)上采用匯編語句進行顯式的段寄存器操作。從GCC 6起,變量在聲明時就可以指定到特殊的段,使用這些內(nèi)存中變量時顯式的段寄存器就會被操作。
增強位置和其他診斷工作:GCC 6的診斷機制引入了“增強位置”特性。這個特性允許CC跟蹤一定范圍的診斷信息,而不僅僅是單個點。舉個例子,一個復(fù)雜表達式中的有疑問的子表達式可以被 識別出來并向開發(fā)人員強調(diào)。診斷現(xiàn)在也包括“修復(fù)”性提示,建議開發(fā)者如何修改錯誤的代碼。這個特性將會在David Malcolm的另一篇博客中詳細介紹。
目標克隆:GCC6 增加了一個新的“目標克隆”屬性,用于指明特定函數(shù)需為不同的ISA變量進行多次編譯,并創(chuàng)建程序分發(fā)器來檢測這些正在使用中的ISA并調(diào)用適合的克隆。這使得對ISA的不同版本提供”特殊運行”程序支持更為容易。
擴展存數(shù)規(guī)則:GCC6 新增一個新的pragma“scalar_storage_order”,用于指定在一個結(jié)構(gòu)內(nèi)字段的字節(jié)順序。如果目標的字節(jié)順序不同于正在被訪問的對象的字節(jié)順序,GCC6會自動生成代碼來按需byte交換這些對象。
卸載/HSA:GCC5 最初已經(jīng)支持通過OpenMP來卸載到MIC,通過OpenACC卸載到Nvidia GPUS. GCC6改進了這些性能并新增了通過HSA加速器來卸載。
語言和運行時
GCC 6 現(xiàn)在的默認值是 C++ 14. GCC 6 現(xiàn)在包括 C++ Concepts.
C++運行時庫現(xiàn)在支持特殊的數(shù)學(xué)函數(shù) (ISO/IEC 29124:2010)
支持 C++17 的實驗功能
std::uncaught_exceptions
unique_key maps 的 try_emplace 和 insert_or_assign
用于訪問容器和數(shù)組的非成員函數(shù) std::size, std::empty 和 std::data
std::invoke
std::shared_mutex
std::void_t 和 std::bool_constant
實驗性的支持文件系統(tǒng)技術(shù)規(guī)范
實驗支持大多數(shù)圖書館基本技術(shù)規(guī)范,包括 shared_ptr 多態(tài)性內(nèi)存資源和陣列支持第二個版本
矩陣相乘的 intrinsic 現(xiàn)在內(nèi)聯(lián)在 Fortran 前端簡單的情況。
當(dāng)然,你可以找到和嘗試更多的優(yōu)化和修正。我甚至不會試圖枚舉所有發(fā)生在這個空間。這與以前的發(fā)布一樣,只要我們可以,我們將盡可能的提高所產(chǎn)生的代碼和修復(fù)更多報告的錯誤。