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

入参含非编译期已知指针的constexpr函数是否支持编译期计算

结论

默认不会强制在编译期执行,仅在满足优化条件或调整函数实现的前提下可实现编译期计算,具体规则如下:

  • constexpr函数本身不强制要求编译期执行,只有当函数调用整体处于常量表达式语境中,或是编译器开启优化时主动做常量折叠,才会在编译阶段完成计算。
  • 你当前的实现中,texCoords是运行期指针,向运行期内存地址写入数据的操作不属于C++标准允许的常量表达式操作,所以这个函数调用本身无法被作为常量表达式使用,不会触发强制编译期计算。
  • 如果编译器开启了O2及以上优化等级,且传入的pixelX、pixelY确实是编译期常量,编译器大概率会提前计算出两个浮点结果的固定值,在运行时直接将立即数写入texCoords指向的地址,实际运行效果和编译期计算完全等价。
  • 如果你需要强制保证计算逻辑在编译期完成,可以调整函数实现,改为直接返回存储计算结果的数组/结构体,不需要传入指针参数:
#include <array>
constexpr std::array<float, 2> pixelToTexCoords(unsigned char pixelX, unsigned char pixelY) {
    return {
        pixelX / 16.f + 1 / 32.f,
        pixelY / 16.f + 1 / 32.f
    };
}

这种写法下,只要传入的两个参数是编译期常量,返回值就可以作为常量表达式使用,保证计算逻辑在编译阶段执行完成。

  • 如果你使用C++20及以上版本,还可以将函数修饰为consteval强制所有调用必须在编译期完成,但该修饰符要求函数调用整体属于合法常量表达式,所以仍然需要你把传指针写结果的逻辑替换为返回值的形式,否则会直接编译报错。

内容的提问来源于stack exchange,提问作者Bruno Jácome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:48:01