核心内容摘要
在STM32CubeMX环境中集成EmbeddingGemma-300m的嵌入式AI方案
constexpr作用于对象时是加强版的const但作用于函数时含义截然不同 —— 它并非简单限定 “返回const值” 或 “结果编译期可知”而是根据调用场景动态适配。
constexpr对象必然具备const只读属性且必须由编译期可知的值完成初始化技术上是翻译期包含编译 链接编程层面可视为编译期。
constexpr函数不保证返回值是 const也不保证结果一定编译期可知—— 结果是否编译期确定完全取决于传入的实参若实参是编译期已知的常量 → 结果在编译期计算可用于 “整型常量表达式” 语境若实参是运行期才能确定的值 → 函数退化为普通函数在运行期计算结果。
编译期可知的常量整型值可用于 C 要求 “整型常量表达式” 的核心语境数组尺寸、整型模板实参如std::array的长度、枚举量的值、对齐修饰符alignas等。
普通const对象无法满足这些场景仅保证只读不保证编译期初始化因此所有constexpr对象都是const对象但并非所有const对象都是constexpr对象。
constexpr函数的特性与限制适用语境可同时适配 “编译期常量计算” 和 “运行期普通计算”无需为两种场景编写不同函数类型限制仅能接收和返回字面值类型即编译期可确定值的类型如内置类型、符合条件的自定义类型实现限制C 版本差异C11函数体仅允许 1 行 return 语句需用三元运算符替代 if-else、递归替代循环C14限制大幅放宽支持循环、局部变量、void 返回值甚至允许修改对象状态的成员函数如自定义类型的 setter。
自定义类型对constexpr的支持C11仅构造函数、返回字面值类型的const getter可声明为constexpr成员函数隐式constC14可将修改对象状态的setter声明为constexprvoid 返回值也允许能基于编译期对象完成更复杂的编译期计算如Point类的中点、镜像点计算。
注意constexpr是对象 / 函数接口的核心组成部分—— 声明后若随意移除如函数新增 I/O 语句依赖它的客户端代码如用在模板参数、数组大小会直接编译失败需长期遵守。
总结constexpr对象都具备const属性并由编译期已知的值完成初始化。
constexpr函数在调用时若传入的实参值是编译器已知的则会产出编译期结果。
比起非constexpr对象或constexpr函数而言constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。
原著在线阅读地址