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