ふと興味が湧いたのでVC5SP3で試してみました。長くて申し訳ない。
いや、やっぱ結構賢いですな、いまどきのコンパイラ君。

class Complex {
    double r;
    double i;
public:

    Complex(double r = 0, double i = 0) : r(r), i(i) {}

    friend Complex operator+(const Complex& c1, const Complex& c2);
    friend Complex operator*(const Complex& c1, const Complex& c2);
};

inline Complex operator+(const Complex& c1, const Complex& c2)
{ return Complex(c1.r + c2.r, c1.i + c2.i); }

inline Complex operator*(const Complex& c1, const Complex& c2)
{ return Complex((c1.r * c2.r - c1.i * c2.i), (c1.r * c2.i + c1.i * c2.r)); }


; 26 : Complex e = a * b + c * d;

mov eax, DWORD PTR _d$[esp+12]
mov ecx, DWORD PTR _a$[esp+12]
mov edx, DWORD PTR _c$[esp+12]
push esi
fld QWORD PTR [eax]
fld QWORD PTR [ecx]
fld QWORD PTR [edx+8]
fld QWORD PTR [ecx+8]
fxch ST(3)
fmul QWORD PTR [edx]
fxch ST(1)
fmul QWORD PTR [eax+8]
fld QWORD PTR [eax]
fxch ST(1)
fsubp ST(2), ST(0)
fxch ST(2)
mov esi, DWORD PTR _b$[esp+16]
push edi
fmul QWORD PTR [esi]
fld QWORD PTR [edx]
fxch ST(4)
fmul QWORD PTR [esi+8]
fsubp ST(1), ST(0)
fxch ST(2)
fmul QWORD PTR [edx+8]
fld QWORD PTR [esi]
fxch ST(3)
faddp ST(2), ST(0)
fxch ST(3)
fmul QWORD PTR [eax+8]
fld QWORD PTR [ecx]
fxch ST(2)
fstp QWORD PTR _e$[esp+24]
fxch ST(2)