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
相关产品推荐
相关产品推荐

