假设我有像
这样的位置的变量const float latitude = 51.+11./60.+33.0461/3600.;
const float longitude = 12.+50./60.+31.9369/3600.;
并在程序中经常使用它们。编译器是否预先计算了? (这个例子不应该产生很多开销,但你明白了。)
指出位置的奖励点。 ;)
TIA
答案 0 :(得分:8)
我认为编译器通常不需要计算算术常量表达式的结果。
编译器是,但是,需要计算整型常量表达式的结果(基本上,一个只由整数组成的常量表达式和其他转换为整数的值)在需要结果的情况下 - 也就是说,当一个整数常量表达式用作数组大小时,作为case
表达式,作为枚举器值等等。
但是,如果任何现代编译器没有计算常量表达式的结果,我会感到惊讶。
答案 1 :(得分:2)
答案 2 :(得分:2)
您的查询有两个独立的问题:常量和常量算术表达式。由于您使用了const
修饰符,因此出现了constness问题。你的问题涉及两者。
在生成任何中间代码或最终汇编代码之前,编译器可以预先计算(求)没有变量的表达式。编译器可以在任何方法中实现常量表达式的赋值,通常用于优化,因为生成的代码的最终结果等于表达式。
例如,某些处理器可以通过使用移位将值加载到寄存器中,并通过从可执行文件中的某个位置加载值来加快速度。 ARM处理器就是其中之一。因此,使用班次加载值比从某个位置加载更有效。
变量定义不必是const
,以便编译器评估和“预计算”常量算术表达式。
const
修饰符在变量声明或定义中使用const
通知编译器在当前作用域结束之前不会修改变量。对从变量中使用作为参数到函数的变量的任何修改都应该向用户生成错误消息。
'const'变量定义不需要只包含常量算术或文本表达式。例如:
void function (const std::string text)
{
const std::string::size_type extra_length(text.length() + 5);
std::cout << "Extra text length: " << extra_length << "\n";
return;
}
在上面的示例中,变量extra_length
不能“预先计算”,因为它取决于函数参数,但它被声明为const
。
对常量算术或文本表达式的评估是与const
修饰符的使用不同的概念。大多数编译器在将其值应用于代码生成器之前将评估和简化常量算术表达式。表达式的值可能不会出现在生成的代码中,因为只要计算的值等于算术表达式的值,就允许编译器生成计算值的代码。这可以作为生成最佳可执行代码的技术来执行。
答案 3 :(得分:0)
是的,我希望C ++编译器能够预先计算出这些值。