左辺値に三項演算子

C/C++では下記のように左辺値にも三項演算子が使えます。
あまり見かけませんが。

    INT     iA, iB, iValue;
    BOOL    bFlag;
    
        :
        :
    
    (bFlag ? iA : iB) = iValue;
    

以下のコードで違いを検証してみました。
void func(LPINT lpiA, LPINT lpiB, BOOL bFlag, INT iValue)
{
#if 1
    (bFlag ? *lpiA : *lpiB) = iValue;
#else
    if(bFlag)
        *lpiA = iValue;
    else
        *lpiB = iValue;
#endif
}

コンパイルしてアセンブリレベルで比較したところ、
  00000 8b 44 24 0c      mov     eax, DWORD PTR _bFlag$[esp-4]
  00004 85 c0            test    eax, eax
  00006 74 0b            je      SHORT $L20101
  00008 8b 44 24 04      mov     eax, DWORD PTR _lpiA$[esp-4]
  0000c 8b 4c 24 10      mov     ecx, DWORD PTR _iValue$[esp-4]
  00010 89 08            mov     DWORD PTR [eax], ecx
  00012 c3               ret     0
$L20101:
  00013 8b 44 24 08      mov     eax, DWORD PTR _lpiB$[esp-4]
  00017 8b 54 24 10      mov     edx, DWORD PTR _iValue$[esp-4]
  0001b 89 10            mov     DWORD PTR [eax], edx
  0001d c3               ret     0

と、どちらも同じ結果でした。
実際にベンチマークして比較しても変わりません(当たり前ですが)。
ソースコードの可読性を考慮するとif文の方をオススメします。


2008.11.09

ETCトップへ