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)
的按位与
我正在用 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)