0

簡単な質問: コンパイラーが2 つの定数(つまり、マクロからの値) を持つ pow() の呼び出しに直面した場合、コンパイル時に評価することによって最適化されますか、それとも実行時に計算されますか?

例:

#define V_BITMEM_GRID 3
#define V_BITMEM_TOTAL pow(V_BITMEM_GRID,2)

ありがとう!

EDITそうでない場合、コンパイル時にマクロの正方形/立方体を別のマクロとして計算する方法はありますか(上記で試みているように)?

4

3 に答える 3

2

それは両方でありえます。コンパイラが関数の実装にアクセスできるかどうか、およびそれを正しく評価できるかどうかは、コンパイラがどれほど侵入的であるかによって異なります。観察された動作が同じである限り、それがどうあるべきかを指定する規則はありません。

たとえば、次のようになりました。

#define X 1
#define Y 2
int foo(int x, int y)
{
    return x + y;
}

int main(int argc, char* argv[])
{
    cout << foo(X,Y);
00BE1000  mov         ecx,dword ptr [__imp_std::cout (0BE203Ch)] 
00BE1006  push        3    
00BE1008  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0BE2038h)] 
}

ご覧のとおり、関数は呼び出されていません。したがって、呼び出しが完全に削除される可能性があります。

于 2012-02-12T12:41:51.877 に答える
1

それに依存してはいけません。マクロベースのアプローチは次のとおりです。

#define POW1(x) (x)
#define POW2(x) ((x)*(x))
#define POW3(x) (POW2(x)*POW1(x))
...
#define POW(x, y) POW##y(x)
于 2012-02-12T12:49:22.273 に答える
0

gcc は、コンパイル時にそのような式をカウントします。

于 2012-02-12T13:37:47.017 に答える