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

C++17中通过函数运行时计算常量,求更优实现方案

更优实现方案推荐

你的代码虽然能实现需求,但可以通过编译期计算消除运行时开销,同时提升代码的效率和可维护性,以下是几种更优的实现方式:

1. 用constexpr函数实现编译期转换

将角度转弧度的函数改为constexpr,确保计算在编译阶段完成,同时把类内常量声明为static constexpr,避免每个类实例重复存储该值:

#include <cmath> // 若使用标准库的M_PI需包含此头文件

constexpr float deg_to_rad(float p_y) {
    return p_y * static_cast<float>(M_PI) / 180.0f;
}

class TEST {  
public: 
    static constexpr float _MOVEMENT_ = deg_to_rad(90);
};

2. 直接定义编译期常量(无需函数)

如果deg_to_rad函数没有复用需求,可以直接写出计算表达式,同样用static constexpr确保编译期计算:

#include <cmath>

class TEST {  
public: 
    static constexpr float _MOVEMENT_ = 90.0f * static_cast<float>(M_PI) / 180.0f;
};

3. 抽离全局常量(多场景复用)

如果这个90度转弧度的常量需要在多个类/函数中使用,可以将其抽离到命名空间中,提升复用性:

#include <cmath>

namespace Constants {
    constexpr float DEG_90_TO_RAD = 90.0f * static_cast<float>(M_PI) / 180.0f;
}

class TEST {  
public: 
    static constexpr float _MOVEMENT_ = Constants::DEG_90_TO_RAD;
};

方案优势

原代码中,const成员变量会随每个类实例初始化(若未加static),且若编译器未做优化,可能在运行时执行计算。而上述方案通过constexpr强制编译期计算,完全消除运行时开销,同时保持代码的可读性和可维护性。

注意:如果你的Math_PI不是编译期常量(比如是运行时初始化的普通const变量),则无法使用constexpr,此时可以改用static const,主流编译器依然会将其优化为编译期常量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:05:00