const int thing = 1234;
int func( int hello )
{
return hello / (thing*123+321);
}
在编译时计算 (thing*123+321)
?
如果thing
是带有int operator*
的用户定义类型,它是否也会在编译时发生?
如果thing
是浮点数或双精度数也会在编译时发生?
如果我在运行时强制更改thing
,(thing*123+321)
会不变?
答案 0 :(得分:3)
不能保证它会,但任何优化编译器都会预先计算该值。它可能会将该除法运算转换为预先计算的倒数值的乘法。
答案 1 :(得分:1)
通常,常量表达式可以并且通常在编译时计算。既然你可以并且如果你确实使用常量表达式作为模板参数,那么实际上没有办法解决这个问题。
现在最大的问题是什么构成了一个恒定的表达。在C ++ 98/03中,你的thing
有资格作为一个,但是thing
的常量函数不会,因为没有办法告诉编译器函数在这个意义上是“纯粹的”
有些编译器提供扩展(例如GCC的属性“pure”和“const”),但这超出了语言的范围。 C ++ 11引入了显式constexpr
关键字,它允许您将各种表达式声明为常量,从而有资格进行编译时评估。 (例如,GCC是使用GMP和MPFR库构建的,以便以任何精度执行这些编译时计算,以便能够以任何平台为目标。)
答案 2 :(得分:0)
在编译时计算(thing * 123 + 321)?
是
你好/(事* 123 + 321);
在这种情况下,完整表达式在运行时计算。因为函数hello
中的参数在运行程序之前是未知的。