後端工坊 2026 年 5 月 31 日

2026-05-31 — C++26 Annotations 泛型 Hashing、NixOS 26.05 systemd Stage 1、Zig Build 重構

primary=https://isocpp.org/blog/2026/05/annotations-for-cpp26-hashing-krystian-piko primary=https://nixos.org/blog/announcements/2026/nixos-2605/ primary=https://ziglang.org/news/2026-build-system-rework/ primary=https://ziglang.org/devlog/2026/elf-linker/

C++26 Annotations 驅動的泛型 Hashing:靜態反射的實用延伸

isocpp.org · 2026-05-29

C++26 的靜態反射讓編譯器可在型別層面迭代成員,但要讓任意型別安全地參與泛型 hash 計算,仍需明確的 opt-in 機制。Krystian Piękoś 的文章展示如何以 C++26 annotations 解決這個問題,讓型別作者以宣告式語法控制哪些成員納入 hash 計算、哪些排除。

核心機制

靜態反射提供 template for 構造,可在編譯期迭代型別的所有 sub-objects(包含 base class 與 non-static data member)。配合 annotations,型別作者在成員宣告處加上標記,讓 calculate_hash() 函式在展開迭代時跳過特定成員:

struct Point {
  [[hash::include]] int x;
  [[hash::include]] int y;
  [[hash::exclude]] mutable int cache_tag; // 不參與 hash
};

整個流程在編譯期完成,不產生執行期 dispatch。Hashable concept 在約束層面保證所有被 template for 展開的 sub-object 都滿足可 hash 條件,否則在實例化點給出清晰的編譯錯誤。

規格背景

Annotations 在 C++26 規格中以 [[vendor::name(args)]] 形式出現,設計為可供任意 attribute 名稱空間使用。本文採用 hash:: 名稱空間,但正式標準化的 hash annotation 語義仍在 SG7(reflection study group)討論中,目前文章呈現的是可行的設計模式而非已確定的 API。相較於傳統手動特化 std::hash 或定義 ADL friend 函式,annotations 方法讓 opt-in 與 opt-out 都能在型別宣告的同一處完成,降低維護分散帶來的不一致風險。

影響範圍

對於大量使用 unordered_map/unordered_set 的程式碼庫,此模式可消除大量樣板特化程式碼。尤其適合含有 mutable cache 欄位或 debug-only 欄位的值型別,這類欄位不應影響語義相等性但過去很難從自動 hash 推導中排除。

原始來源:isocpp.org


NixOS 26.05「Yarara」:systemd Stage 1 正式預設,最後一個 x86_64-darwin 版本

NixOS · 2026-05-28

NixOS 26.05,代號「Yarara」,於 2026 年 5 月 28 日釋出,2,842 名貢獻者完成 59,703 個 commit。最重要的架構變更是將 systemd-based initrd 設為預設 stage 1,舊有的腳本式初始化流程進入棄用階段。此外,本版本是 Nixpkgs 對 x86_64-darwin 提供原生支援的最後一個穩定釋出。

systemd Stage 1 轉為預設

systemd initrd 自 2024 年起作為可選項提供,在 26.05 全面啟用。主要效果:早期開機錯誤輸出至 systemd-journaldsystemd-cryptsetup 與 TPM2 的 LUKS2 磁碟解密配置更直接;boot.initrd.extraFiles 部分配置可能需調整為 boot.initrd.systemd.storePaths從 scripted initrd 遷移時需注意 kernel module 載入順序,可暫時以 boot.initrd.systemd.enable = false 回退(deprecated,非長期支援)。

工具鏈與套件更新

元件25.1126.05
GCC1415
LLVM1921
GNOME4850 "Tokyo"
新增套件+20,442
更新套件20,641

x86_64-darwin 終止計畫

Apple 持續棄用 x86_64 支援,Nixpkgs 的 Intel macOS 原生支援在 26.05 後進入終止階段。二進位快取維持至 2026-12-31。aarch64-darwin(Apple Silicon)不受影響。NixOS 25.11「Xantusia」EOL 為 2026-06-30,須在此前完成升級。

原始來源:NixOS 官方公告Linux Journal


Zig Build System 重構:Lazy Dependency Evaluation 與 ELF Linker 正確性改進

ziglang.org · 2026-05-31

Zig 的 build system 在近期開發週期完成大規模架構重構,核心目標是解決大型 monorepo 中 eager dependency resolution 導致的啟動延遲問題,並搭配 ELF linker(zld)的一系列正確性修正。

Lazy Dependency Evaluation

舊有 build graph 在 zig build 啟動時完整展開所有 addDependency 聲明,即便目標 step 根本不需要某些依賴。新架構引入 lazy evaluation:依賴只在對應的 build step 真正被請求時才解析,未被選取的 module 的 fetch 與 compile 步驟完全跳過。對含有數十個可選功能的大型 build 腳本,冷啟動時間顯著下降。

ELF Linker 改進

  • IFUNC 支援:正確處理 STT_GNU_IFUNC symbol 的 PLT/GOT 生成,使依賴 glibc 平台特定優化路徑的 C 程式庫可正確鏈結
  • 版本化 symbol:改進 .gnu.version/.gnu.version_d/.gnu.version_r section 解析,解決部分系統函式庫的鏈結失敗
  • Debug section 壓縮:支援 SHF_COMPRESSED DWARF section,減少 debug build 的 binary 體積

影響範圍

Zig 目前仍在 0.14.x 系列,build system API 尚未穩定,此次重構可能需要更新 build.zig 中部分 API 呼叫。ELF linker 的改進對 Linux-native Zig 用戶影響最直接,特別是混合 Zig 與 C 的跨語言專案。

原始來源:Zig Build System ReworkZig ELF Linker Devlog


End of article
0
Would love your thoughts, please comment.x
()
x