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

Are const constant operations evaluated at run time?

我正在用 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 运算是在运行时完成的吗?还是编译器做的?

通常:C++ 编译器可以进行任何优化,只要优化的结果是 "as if" 代码按字面执行。

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

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

movabsq 57430888798830399, %rax

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

的按位与