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

如何同时声明返回bool的nodiscard函数与void版本及二者性能对比

性能差异说明

在开启O2及以上编译器优化的前提下,返回bool的版本和返回void的版本运行速度完全一致。
主流CPU架构(x86、ARM)下,小型返回值会通过通用寄存器传递,如果你没有接收bool返回值,编译器会自动忽略返回值的赋值逻辑,只要两个函数的内部执行逻辑完全相同,最终生成的汇编指令不存在差异,没有额外性能开销。
只有在无优化(O0)的调试编译场景下,返回bool的版本可能会多出1条寄存器赋值指令,该差异可以忽略不计。

同时实现两个版本的合法方案

C++不支持仅通过返回值差异做函数重载,你可以通过以下三种方案实现需求:

  • 标记参数重载
    定义一个空标记类型区分两个重载函数,优化后标记参数会被完全消除,无运行时开销:
    // 定义空标记
    struct ignore_return_t {};
    inline constexpr ignore_return_t ignore_return{};
    
    // 带返回值的版本,可加nodiscard
    [[nodiscard]] bool your_func() {
        // 你的业务逻辑
    }
    // 无返回值的版本
    void your_func(ignore_return_t) {
        your_func();
    }
    
    // 调用示例
    bool res = your_func(); // 拿返回值
    your_func(ignore_return); // 忽略返回值
    
  • 模板特化实现
    用编译期分支生成两个不同返回值的版本,不需要维护两套业务逻辑:
    #include <type_traits>
    
    template<typename T = bool>
    T your_func() {
        static_assert(std::is_same_v<T, bool> || std::is_same_v<T, void>, "仅支持bool/void返回值");
        bool exec_res = /* 你的业务逻辑 */;
        if constexpr (!std::is_void_v<T>) {
            return exec_res;
        }
    }
    
    // 调用示例
    bool res = your_func(); // 拿返回值
    your_func<void>(); // 忽略返回值
    
  • 单函数+显式忽略返回值(更推荐)
    不需要额外实现void版本,只保留加了[[nodiscard]]的bool版本,不需要返回值时显式做强制转换消除警告即可,维护成本最低:
    [[nodiscard]] bool your_func() {
        // 你的业务逻辑
    }
    
    // 调用时显式忽略返回值,不会触发nodiscard警告
    (void)your_func();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:45:03