使用static / global const原语进行计算是否在编译时发生?

时间:2011-11-06 14:30:06

标签: c++

const int thing = 1234;

int func( int hello )
{
    return hello / (thing*123+321);
}

在编译时计算 (thing*123+321)

如果thing是带有int operator*的用户定义类型,它是否也会在编译时发生?

如果thing是浮点数或双精度数也会在编译时发生?

如果我在运行时强制更改thing(thing*123+321)会不变?

3 个答案:

答案 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中的参数在运行程序之前是未知的。