是否在运行时评估const常量运算?

时间:2016-06-13 02:33:50

标签: c++ optimization compilation chess

我在C ++中做了一些国际象棋编程,结果有很多按位操作我需要处理一些大数字。我想知道,如果在运行时进行常量操作,那么性能是否正常?或者,如果他们在编译期间进行评估。例如假设我必须AND以下2个常量:

const unsigned long long FILE_A = ~0x8080808080808080;
const unsigned long long FILE_B = ~0x4040404040404040;

在像这样的函数中

unsigned long long join(){
    return (FILE_A & FILE_B);
}

FILE_A和FILE_B上的AND操作是否在运行时完成?或编译器是否这样做?

2 个答案:

答案 0 :(得分:3)

一般情况下:只要优化的结果是"就像"那样,C ++编译器就可以进行任何优化。代码是按字面意思执行的。

在您给出的示例中,在编译时执行给定的计算与在运行时执行此操作无法区分;所以现代C ++编译器就是这样做的。事实上,现代C ++编译器,如果join()在头文件中定义(具有inline属性) - 并且如果选择了适度的优化级别 - 将不仅在编译时进行计算,但完全优化join(),并直接在join()使用的地方注入计算常量,从而可以进行额外的编译时优化。这是因为如果没有任何优化,结果将与结果无法区分。

答案 1 :(得分:1)

从它看起来的事情来看。我将我的代码,上面的代码放在此转换器https://assembly.ynh.io/中,而对于行return (FILE_A & FILE_B);,它会输出以下程序集

movabsq $4557430888798830399, %rax

是的,4557430888798830399是按位的(~0x8080808080808080)(~0x4040404040404040)