You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用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;
}

关键细节说明

  1. 为什么用指针版本的std::any_cast?
    引用版本的std::any_cast<T>(a)在类型不匹配时会抛出std::bad_any_cast异常,编译器很难优化掉异常处理的分支逻辑,哪怕加了__builtin_unreachable也无效。而指针版本std::any_cast<T>(&a)仅返回nullptr(不抛出异常),逻辑更简单,编译器更容易配合__builtin_unreachable消除检查分支。

  2. __builtin_unreachable的作用
    这个编译器内置函数明确告诉编译器:ptr == nullptr的情况永远不会发生。g++12.3和clang18会据此完全移除空指针检查的分支,直接生成指针解引用的指令,彻底消除类型检查的性能开销。

  3. 行为边界
    当你确定std::any存储的类型与目标类型完全匹配时,这个函数的性能等同于直接访问原始对象;如果类型不匹配,会触发未定义行为(空指针解引用或进入不可达代码),符合你允许UB的需求。

内容的提问来源于stack exchange,提问作者LMauricius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:56:09