這兩個成員函數沒有區別。它必須是,因爲這是C++標準(ISO/IEC 14882:2003)具有地說:
9.3.1非靜態成員函數[class.mfct.nonstatic]
2.當在非靜態成員函數的主體中使用不屬於類成員 訪問語法(5.2.5)且未用於形成指向成員(5.3.1) 的id-expression
(5.1)時X
或 用於mem-initializer
中類X
的構造函數,如果nam È 查找(3.4.1)可解決id-expression
名稱X
類或基類的X
的非靜態 無類型部件,所述 id-expression
被轉換成使用(*this)
類成員訪問表達式 (5.2.5) (9.3.2)作爲.
運算符的左側 的後綴表達式。然後成員名稱引用調用該函數的對象的成員。
5.2.5類的成員訪問[expr.ref]
3.如果E1
具有類型「指針X
類」,則表達 E1->E2
被轉換爲等效的形式(*(E1)).E2;
。 ..
因此,這意味着下面的代碼:
class C
{
public:
void set_x(int val) { x = val; }
void set_this_x(int val) { this->x = val; }
private:
int x;
};
將根據9.3.1/2和5.2轉換爲以下代碼。5/3:
class C
{
public:
void set_x(int val) { (*this).x = val; } // as per 9.3.1/2
void set_this_x(int val) { (*(this)).x = val; } // as per 5.2.5/3
private:
int x;
};
爲了證明真的是沒有區別的,至少一個編譯器,這裏的禁用C::set_x()
和C::set_this_x()
功能VC++編譯器優化發出的拆卸的側方比較(/Od
):
void set_x(int val){ x = val; } void set_this_x(int val){ this->x = val; }
push ebp push ebp
mov ebp,esp mov ebp,esp
sub esp,0CCh sub esp,0CCh
push ebx push ebx
push esi push esi
push edi push edi
push ecx push ecx
lea edi,[ebp-0CCh] lea edi,[ebp-0CCh]
mov ecx,33h mov ecx,33h
mov eax,0CCCCCCCCh mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi] rep stos dword ptr es:[edi]
pop ecx pop ecx
mov dword ptr [ebp-8],ecx mov dword ptr [ebp-8],ecx
mov eax,dword ptr [this] mov eax,dword ptr [this]
mov ecx,dword ptr [val] mov ecx,dword ptr [val]
mov dword ptr [eax],ecx mov dword ptr [eax],ecx
pop edi pop edi
pop esi pop esi
pop ebx pop ebx
mov esp,ebp mov esp,ebp
pop ebp pop ebp
ret 4 ret 4
注意,編譯器產生完全相同的組件兩個成員函數。
+1:清潔代碼第一! – Johnsyweb
謝謝你的回答! :-) 我還沒有做出任何優化,只是想着時間到了的地方。我從過早的優化中被燒過一次,得到了足夠的:-)。 – TCS