我在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操作是否在运行时完成?或编译器是否这样做?
答案 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)