2016-06-13 8 views
1

私はC++でいくつかのチェスプログラミングをやっています。その結果、いくつかの大きな数値でビット演算を行う必要があります。実行時に一定の操作が行われた場合は、私は不思議でしたか?コンパイル中に評価された場合例えば私がして、以下の2つの定数があるとします。この定数定数演算は実行時に評価されますか?

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

のような関数で

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

は、実行時に行わFILE_AとFILE_BとのAND演算ですか?それともコンパイラはそれをしますか?

+3

はそれを試してみて、アセンブリを検査していますコンパイラによって生成された –

答えて

3

一般的に、C++コンパイラは、最適化の結果が文字通りそのまま実行されている限り、最適化を行うことができます。

与えた例では、コンパイル時に所定の計算を実行することは、実行時に行うことと区別できません。現代のC++コンパイラはこれを正確に実行します。実際には、join()がヘッダーファイル(inline属性)で定義されている場合、中程度の最適化レベルが選択されていれば、最新のC++コンパイラはコンパイル時に計算を行うだけでなく、join()を完全に最適化し、 join()が使用された場所に計算された定数を直接注入し、追加のコンパイル時の最適化を可能にします。なぜなら、最適化されたものがなければ、その結果は結果と区別できないからです。

+0

ああ、私は、確かに、結合が意味をなさないが、それは単なる例だった。答えをありがとう! –

1

ものの外観からです。私はこのコンバータhttps://assembly.ynh.io/では上記の私のコード、1を入れて、ラインreturn (FILE_A & FILE_B);のためには、以下のアセンブリ

movabsq $4557430888798830399, %rax 

を出力し、はい、4557430888798830399はビット単位と(~0x8080808080808080)のと(~0x4040404040404040)