入参含非编译期已知指针的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
相关产品推荐
相关产品推荐

