如何同时声明返回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
相关产品推荐
相关产品推荐

