Không có sự khác biệt giữa hai hàm thành viên. Nó phải được, vì đây là những gì C++ Standard (tiêu chuẩn ISO/IEC 14882: 2003) đã nói:
9.3.1 hàm thành viên không tĩnh [class.mfct.nonstatic]
2. Khi số id-expression
(5.1) không phải là một phần của một thành viên lớp cú pháp truy cập (5.2.5) và không được sử dụng để tạo thành con trỏ tới thành viên (5.3.1) được sử dụng trong nội dung của một hàm thành viên không phải là thành viên của lớp X
hoặc được sử dụng trong các mem-initializer
cho một nhà xây dựng của lớp X
, nếu nam e tra cứu (3.4.1) giải quyết các tên trong id-expression
cho một thành viên không do type không tĩnh của lớp X
hoặc của một lớp cơ sở của X
, các id-expression
được chuyển thành một biểu thức truy cập thành viên lớp (5.2.5) sử dụng (*this)
(9.3.2) dưới dạng biểu thức hậu tố ở bên trái của toán tử .
. Tên thành viên sau đó đề cập đến các thành viên của đối tượng mà chức năng được gọi.
5.2.5 truy cập thành viên Class [expr.ref]
3. Nếu E1
có kiểu “con trỏ đến lớp X
”, sau đó biểu thức E1->E2
được chuyển đổi sang các hình thức tương đương (*(E1)).E2;
. ..
Vì vậy, đó có nghĩa là đoạn mã sau:
class C
{
public:
void set_x(int val) { x = val; }
void set_this_x(int val) { this->x = val; }
private:
int x;
};
sẽ được chuyển thành mã sau theo 9.3.1/2 và 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;
};
Để hiển thị rằng có thực sự là không có sự khác biệt, ít nhất là cho một trình biên dịch, đây là một sự so sánh side-by-side của disassembly của C::set_x()
và C::set_this_x()
chức năng VC++ biên dịch phát ra với tối ưu hóa bị vô hiệu hóa (/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
Lưu ý rằng trình biên dịch tạo ra chính xác cùng lắp ráp cho cả hai chức năng thành viên.
+1: Mã sạch đầu tiên! – Johnsyweb
Cảm ơn bạn đã trả lời! :-) Tôi chưa thực hiện bất kỳ tối ưu hóa nào, chỉ cần nghĩ đến những địa điểm có thể được thực hiện khi thời gian đến. Tôi đã bị đốt cháy một lần từ tối ưu hóa sớm, đã có đủ điều đó :-). – TCS