4

これは私のC++コードです

class CTest {
public:
    int number;
    int arr[10];
};

CTest Return(int val) {
    CTest obj;
    obj.number = val;
    return obj;
}

int main() {
    CTest obj = Return(10);
    return 0;
}

アセンブリコードを見ると、2 つの一時オブジェクトがあることがわかりました。

//in main

    CTest obj = Return(10);
0009F6CE  push        0Ah  
0009F6D0  lea         eax,[ebp-158h]  ; pass the first temporary object's address to Return
0009F6D6  push        eax  
0009F6D7  call        Return (0822E9h)  
0009F6DC  add         esp,8  
0009F6DF  mov         ecx,0Bh  
0009F6E4  mov         esi,eax  
0009F6E6  lea         edi,[ebp-124h]  ; copy from the first temporary object
0009F6EC  rep movs    dword ptr es:[edi],dword ptr [esi]  
0009F6EE  mov         ecx,0Bh  
0009F6F3  lea         esi,[ebp-124h]  
0009F6F9  lea         edi,[obj]       ; copy from the second temporary object
0009F6FC  rep movs    dword ptr es:[edi],dword ptr [esi]

//in Return

    CTest obj;
    obj.number = val;
0009F64E  mov         eax,dword ptr [val]  
0009F651  mov         dword ptr [obj],eax  
    return obj;
0009F654  mov         ecx,0Bh  
0009F659  lea         esi,[obj]  
0009F65C  mov         edi,dword ptr [ebp+8]  
0009F65F  rep movs    dword ptr es:[edi],dword ptr [esi]  ; copy to the first temporary object
0009F661  mov         eax,dword ptr [ebp+8]  

2 番目の一時オブジェクトを取得した理由。一時オブジェクトは 1 つだけで十分なようです。空のデストラクタを追加する~CTest() {}と、一時オブジェクトがなくなります (RVO?)。

4

1 に答える 1

0

「2番目の一時オブジェクトを取得した理由」

最適化をオフにしたことが原因である可能性があります。

objそれ以外の場合、コンパイラはmain から隠しパラメーター (ポインターと同様) として Return 関数に渡すことで最適化し、thisそれに「結果」を割り当てます。

したがって、最適化後、コードは次のようになります。

void Return(void* put_result_here , int val) {
    CTest obj;
    obj.number = val;
    put_result_here = obj;
}


int main() {
    CTest obj; 
    Return(&obj , 10);
    return 0;
}

この最適化は、値によるリターンの最適化と呼ばれます。

于 2013-07-28T09:38:48.887 に答える