7

C++ コンパイラは 0*x を最適化しますか? つまり、0に変換するのですか、それとも実際に乗算を行うのですか?

ありがとう

4

2 に答える 2

7

かもしれない:

int x = 3;
int k = 0 * 3;
std::cout << k;

00291000  mov         ecx,dword ptr [__imp_std::cout (29203Ch)] 
00291006  push        0    
00291008  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (292038h)] 

変数を完全に最適化することさえあります。

しかし、そうではないかもしれません:

struct X
{
    friend void operator *(int first, const X& second)
    {
       std::cout << "HaHa! Fooled the optimizer!";
    }
};

//...
X x;
0 * x;
于 2012-07-15T12:56:14.920 に答える
4

x がプリミティブ整数型の場合、コード ジェネレーターは、一般に「算術規則」と呼ばれる最適化を使用して、次のような変更を行います。

int x = ...;
y = 0 * x;   ===> y = 0
y = 1 * x;   ===> y = x
y = 2 * x;   ===> y = x + x;

ただし、整数型のみ。

x が非整数型の場合、0 * x常に と等しいとは限らない0か、副作用がある可能性があります。

于 2012-07-15T13:53:17.793 に答える