如何仅用C++标准库实现unsafe_any_cast级别的性能?
实现标准库原生的无检查std::any转换(允许未定义行为)
要在标准库范围内实现无检查、高性能的std::any类型转换,核心思路是利用std::any_cast的指针版本配合编译器内置的不可达提示,彻底消除类型检查开销。
实现代码
#include <any> template<typename T> T& unsafe_any_cast(std::any& a) noexcept { T* ptr = std::any_cast<T>(&a); if (!ptr) { __builtin_unreachable(); } return *ptr; } template<typename T> const T& unsafe_any_cast(const std::any& a) noexcept { const T* ptr = std::any_cast<T>(&a); if (!ptr) { __builtin_unreachable(); } return *ptr; } template<typename T> T* unsafe_any_cast(std::any* a) noexcept { if (!a) return nullptr; T* ptr = std::any_cast<T>(a); if (!ptr) { __builtin_unreachable(); } return ptr; }
关键细节说明
为什么用指针版本的std::any_cast?
引用版本的std::any_cast<T>(a)在类型不匹配时会抛出std::bad_any_cast异常,编译器很难优化掉异常处理的分支逻辑,哪怕加了__builtin_unreachable也无效。而指针版本std::any_cast<T>(&a)仅返回nullptr(不抛出异常),逻辑更简单,编译器更容易配合__builtin_unreachable消除检查分支。__builtin_unreachable的作用
这个编译器内置函数明确告诉编译器:ptr == nullptr的情况永远不会发生。g++12.3和clang18会据此完全移除空指针检查的分支,直接生成指针解引用的指令,彻底消除类型检查的性能开销。行为边界
当你确定std::any存储的类型与目标类型完全匹配时,这个函数的性能等同于直接访问原始对象;如果类型不匹配,会触发未定义行为(空指针解引用或进入不可达代码),符合你允许UB的需求。
内容的提问来源于stack exchange,提问作者LMauricius
相关产品推荐
相关产品推荐

