Ответ 1
Нет никакой разницы между двумя функциями-членами. Это должно быть, поскольку это то, что должен сказать стандарт С++ (ISO/IEC 14882: 2003):
9.3.1 Нестатические функции-члены [class.mfct.nonstatic]
2. Когда
id-expression
(5.1), который не является частью члена класса синтаксиса доступа (5.2.5) и не используется для формирования указателя на элемент (5.3.1) используется в теле нестатической функции-члена классаX
или используется вmem-initializer
для конструктора классаX
, если имя lookup (3.4.1) разрешает имя вid-expression
для нестатического nontype члена классаX
или базового классаX
,id-expression
преобразуется в выражение доступа к члену класса (5.2.5) с использованием(*this)
(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()
, которые компилятор VС++ испускает с отключенными оптимизациями (/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
Обратите внимание, что компилятор создает ту же самую сборку для обеих функций-членов.