經過一年的開發,免費的 GCC 編譯器套件 GCC 15.1 已經發布,這是新 GCC 15.x 分支中的第一個主要版本。根據發布編號方案,開發過程中使用了版本 15.0,而在 GCC 15.1 發布之前不久,已經分叉了 GCC 16.0 的一個分支,這將成為下一個主要版本 GCC 16.1 的基礎。
主要變化:
- 編譯 C 程式時,預設使用帶有 GNU 擴充功能(“-std=gnu23”)的 C23 標準(變更摘要)。以前,預設使用 C17 標準(-std=gnu17)。由於包含 nullptr 常數、_BitInt(n) 類型以及 bool、true 和 false 關鍵字,此變更可能會在建立現有項目時引發問題,這些關鍵字可能會與應用程式中定義的類似命名的識別碼相衝突。
- 已實現 C23 標準的以下功能:
- “#embed”指令用於將二進位資源嵌入到程式碼中。
- “unsequenced”屬性,表示結果不依賴執行順序。
- 「可重複」屬性表示函數在給定相同輸入的情況下始終會傳回相同的結果,即不依賴其他因素。
- 未來 C2Y 標準的元素已經實現(-std=c2y 和 -std=gnu2y):
- 能夠在「if」語句中宣告變數,例如「if (int x = get ()) {...}」。
- 支援命名循環以便在程式碼中引用它們。外部:for (int i = 0; i < IK; ++ i) { switch (i) {case 1:break; // 跳到 CONT1 case 2: break outer; // 跳到 CONT2 } // CONT1 } // CONT2
- 支援在case表達式中指定整數值的範圍,例如「case 1...10:」。
- 後綴“i”和“j”表示複數的虛部。
- 可以對複數使用“++”和“—”運算子。
- “_Generic(type, expr1, expr2, …)”構造用於根據運算元類型選擇表達式。
- 支援像其他物件類型(例如結構和聯合)一樣存取位元組數組。
- 支援將“alignof”運算子應用於不完整數組(未指定大小的聲明數組,例如“int a[]”)。
- 新增了八進位、十六進位和通用字元轉義序列的新語法。建議使用序列“\u{}”、“\o{}”和“\x{}”來代替“\u”、“\x”和“\nnn”,其中可以指定任意數量的數字。
- 內建函數「__builtin_stdc_rotate_left」和「__builtin_stdc_rotate_right」。
- 允許對 NULL 指標進行零長度操作(例如“sizeof(*p)”)。
- C++ 語言的前端實作了正在為未來 C++26 標準開發的功能:
- 變分算子「朋友」(「朋友Ts ...」)。
- 能夠使用 constexpr 關鍵字和 new 運算子的變體(placement new)在編譯時將物件放置到預先分配的記憶體中。
- 刪除指向不完整類型的指標時輸出錯誤。
- 使用省略號且前面沒有逗號來定義可變參數的語法(例如,指定“void e(int…)”而不是“void e(int, …)”)已被棄用。
- 在範本中索引參數包。
- 結構化綁定的屬性;
- 語法'= delete("reason")';
- 基本字元集中包含“@”、“$”和“`”。
- 禁止使用巨集來聲明模組。
- 能夠使用結構化綁定作為 if 和 switch 語句中的條件。
- 已停止支援直接數組比較(例如“int arr1[5]; int arr2[5]; bool same = arr1 == arr2”)。
- 用於嵌入二進位資源的「#embed」機制。
- is_trivial 模板類別已被棄用。
- 新增了 C++23 功能:
- 禁止使用某些“export”指令,並允許使用“export {}”。
- 支援延長在範圍內迭代的 for 迴圈中的臨時物件的生存期。
- libstdc++ 函式庫實作了對 std 和 std.compat 模組的實驗性支援。
- 在 C 和 C++ 程式碼中使用聯合的「{0}」初始化程序不再保證清除所有內容,而是導致聯合的第一個元素被清除。若要清除整個聯合,請使用 C23 規範中定義的「{}」表達式,或指定「-fzero-init-padding-bits=unions」選項來還原舊行為。
- 實作了對「musttail」屬性([[gnu::musttail]] 和 [[clang::musttail]])的支持,以確保尾部呼叫。此屬性適用於對目前函數進行遞歸呼叫的返回語句,並確保此類呼叫將使用尾遞歸,這樣就不會在堆疊上分配額外的記憶體(消除了因大量呼叫而導致記憶體耗盡的風險)。
- 實現了對應用於枚舉的 flag_enum 屬性([[gnu::flag_enum]] 和 [[clang::flag_enum]])的支持,以指示內容用於位元運算(防止在 -Wswitch 模式下出現警告)。
- 增加了對「counted_by」屬性的支持,該屬性可用於指定具有確定元素數量的靈活數組的結構中的欄位。此屬性可用於提高緩衝區溢位檢查的效率。
- 為函數新增了「nonnull_if_nonzero」屬性,該屬性指定某些帶有指標的函數參數只有在另一個參數為零時才可以為 NULL。
- 允許擴充彙編程式在函數外部內聯“asm(….)”。在彙編程式插入中,允許覆蓋堆疊紅色區域(堆疊頂部的區域)中的記憶體。
- 由於模板散列的改進,C++ 程式碼的編譯速度更快。
- 新增了新的優化。已經實現了對包含提前退出程式碼(例如,透過中斷或返回呼叫)的向量化循環的支持,即使此類循環操作在編譯時大小未知的動態分配的數組或緩衝區。當指定 -O2 選項時,將啟用一些易於向量化但無法獲得行程計數資訊的循環的向量化。
- 在連結階段新增了增量最佳化模式(LTO,連結時最佳化),當程式碼有微小改動(編輯了一個函數)時,使用LTO可以顯著減少重新編譯時間。為了啟用增量模式,建議使用“-flto-incremental”選項。
- 改進了非常大的輸入檔的編譯。實現了對大於 4096 的列號的追蹤。提高了指示非常大的文件中錯誤和警告位置的準確性。
- 診斷問題時提高報告的可見度。例如,用“⚠️”符號突出顯示問題的位置,更改了 C++ 模板中錯誤輸出的佈局,添加了提示以簡化向 C23 標準的過渡,並重新設計了配色方案。增加了以 Sarif 格式輸出診斷資訊的功能 (-fdiagnostics-format=sarif-file)。
- libgdiagnostics 庫已經實現,可讓您將與診斷訊息設計相關的 GCC 功能整合到您的專案中(例如,您可以使用引用、突出顯示和修正提示)。
- 新增了「-Wtrailing-whitespace」和「-Wleading-whitespace」警告,以偵測行尾的殘留空格和行首的額外空格。
- 新增了「-Wheader-guard」警告來報告頭檔保護巨集中的問題,這些問題阻止了頭檔再次被包含。
- D 語言的前端已更新至版本 2.111.0。
- Fortran 前端已新增對無符號整數的支援。
- 軟體包包含 COBOL 語言的編譯器 gcobol,它支援 x86-64 和 AArch64 平台,不適用於 32 位元系統。此編譯器實作了 ISO/IEC 1989:2023 規格並通過了大部分 NIST CCVS/85 測試。
- OpenMP 5.0、5.1、5.2 和 6.0(開放多處理)標準的實作一直在繼續,這些標準定義了在具有共享記憶體和向量化單元(SIMD)的多核心和混合(CPU+GPU/DSP)系統上應用平行程式設計方法的 API 和方法。增加了對元指令和平鋪、展開、互通和調度結構的支援。對於某些 AMD 和 NVIDIA GPU,已新增統一共享記憶體的支援(透過在「requires」指令中指定 unified_shared_memory 來啟用)。增加了對“self_maps”表達式的支持。
- AArch64 架構的後端已更新,以支援 MinGW 平台 (aarch64-w64-mingw32)。已實現超過 20 個 ARM8 擴展,並改進了對 ACLE(Arm C 語言擴展)擴展的支援。程式碼產生器已得到大量改進。增加了 CPU 支援:
- 蘋果 A12 (apple-a12)
- 蘋果 M1 (apple-m1)
- 蘋果 M2 (apple-m2)
- 蘋果 M3 (apple-m3)
- Arm Cortex-A520AE (cortex-a520ae)
- Arm Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725(cortex-a725)
- Arm Cortex-R82AE (cortex-r82ae)
- Arm Cortex-X925 (cortex-x925)
- Arm Neoverse N3(neoverse-n3)
- Arm Neoverse V3(neoverse-v3)
- Arm Neoverse V3AE(neoverse-v3ae)
- 富士通最中 (fujitsu-monaka)
- NVIDIA Grace
- NVIDIA 奧林巴斯(奧林巴斯)
- 高通獵鷹-1(Oryon-1)
- AMD Radeon GPU (GCN) 程式碼產生後端已更新為支援 libstdc++ 函式庫,並為 gfx9-generic、gfx10-3-generic 和 gfx11-generic 裝置系列新增了實驗性程式碼產生支援。
- x86 後端現在支援英特爾指令集架構擴展 AVX10.2、AMX-AVX512、AMX-FP8、AMX-MOVRS、AMX-TF32、AMX-TRANSPOSE、MOVRS。增加了對 Intel Diamond Rapids 和 Xeon Phi CPU 的支援。
- 擴展 LoongArch 和 AVR 平台的後端功能。
- 刪除了對 Nios II 處理器中使用的 nios2 目標架構的支援。 AArch32 連接埠中對 ILP32 ABI(-mabi=ilp64)的支援已被棄用,並將在下一個主要版本中刪除。
來源: opennet.ru
