Является ли доступ к классу членов С++ через "this-> member" быстрее/медленнее, чем неявный вызов "член",

После некоторого поиска в нашем другом google я не смог получить четкое представление о следующем пункте.

Я использую для вызова членов класса с this->. Даже если это не нужно, я нахожу его более явным, поскольку он помогает при сохранении некоторой тяжелой части алгоритма с множеством варов.

Поскольку я работаю над алгоритмом, который должен быть оптимизирован, мне было интересно, будет ли использование this-> изменять производительность во время выполнения или нет.

Это?

Ответ 1

Нет, вызов в обоих случаях точно такой же.

Ответ 2

Это не имеет никакого значения. Вот демонстрация с GCC. Источник - простой класс, но я явно ограничил это сообщение различием для ясности.

% diff -s with-this.cpp without-this.cpp
7c7
<         this->x = 5;
---
>         x = 5;

% g++ -c with-this.cpp without-this.cpp  

% diff -s with-this.o without-this.o   
Files with-this.o and without-this.o are identical

Ответ 3

Ответ предоставлен zennehoy и здесь код сборки (сгенерированный компилятором Microsoft С++) для простого тестового класса:

class C
{
    int n;
public:
    void boo(){n = 1;}
    void goo(){this->n = 2;}
};

int main()
{
   C c;
   c.boo();
   c.goo();

       return 0;
}

Окно разборки в Visual Studio показывает, что код сборки одинаковый для обеих функций:

class C
{
    int n;
public:
    void boo(){n = 1;}
001B2F80 55                   push        ebp  
001B2F81 8B EC                mov         ebp,esp  
001B2F83 81 EC CC 00 00 00    sub         esp,0CCh  
001B2F89 53                   push        ebx  
001B2F8A 56                   push        esi  
001B2F8B 57                   push        edi  
001B2F8C 51                   push        ecx  
001B2F8D 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  
001B2F93 B9 33 00 00 00       mov         ecx,33h  
001B2F98 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
001B2F9D F3 AB                rep stos    dword ptr es:[edi]  
001B2F9F 59                   pop         ecx  
001B2FA0 89 4D F8             mov         dword ptr [ebp-8],ecx  
001B2FA3 8B 45 F8             mov         eax,dword ptr [this]  
001B2FA6 C7 00 01 00 00 00    mov         dword ptr [eax],1  
001B2FAC 5F                   pop         edi  
001B2FAD 5E                   pop         esi  
001B2FAE 5B                   pop         ebx  
001B2FAF 8B E5                mov         esp,ebp  
001B2FB1 5D                   pop         ebp  
001B2FB2 C3                   ret  
...
--- ..\main.cpp -----------------------------
void goo(){this->n = 2;}
001B2FC0 55                   push        ebp  
001B2FC1 8B EC                mov         ebp,esp  
001B2FC3 81 EC CC 00 00 00    sub         esp,0CCh  
001B2FC9 53                   push        ebx  
001B2FCA 56                   push        esi  
001B2FCB 57                   push        edi  
001B2FCC 51                   push        ecx  
001B2FCD 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  
001B2FD3 B9 33 00 00 00       mov         ecx,33h  
001B2FD8 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
001B2FDD F3 AB                rep stos    dword ptr es:[edi]  
001B2FDF 59                   pop         ecx  
001B2FE0 89 4D F8             mov         dword ptr [ebp-8],ecx  
001B2FE3 8B 45 F8             mov         eax,dword ptr [this]  
001B2FE6 C7 00 02 00 00 00    mov         dword ptr [eax],2  
001B2FEC 5F                   pop         edi  
001B2FED 5E                   pop         esi  
001B2FEE 5B                   pop         ebx  
001B2FEF 8B E5                mov         esp,ebp  
001B2FF1 5D                   pop         ebp  
001B2FF2 C3                   ret  

И код в основном:

    C c;
    c.boo();
    001B2F0E 8D 4D F8             lea         ecx,[c]  
    001B2F11 E8 00 E4 FF FF       call        C::boo (1B1316h)  
    c.goo();
    001B2F16 8D 4D F8             lea         ecx,[c]  
    001B2F19 E8 29 E5 FF FF       call        C::goo (1B1447h)  

Microsoft compiler использует условное соглашение __thiscall по умолчанию для вызовов членов класса, а указатель this передается через регистр ECX.

Ответ 4

В компиляции языка имеется несколько слоев.

Разница между доступом к member как member, this->member, MyClass::member и т.д.... является синтаксической разницей.

Точнее, это вопрос поиска имени и как внешний интерфейс компилятора "найдет" точный элемент, на который вы ссылаетесь. Таким образом, вы можете ускорить компиляцию, будучи более точным... хотя это будет незаметно (в С++ есть гораздо более трудоемкие задачи, такие как открытие всех этих включений).

Так как (в этом случае) вы ссылаетесь на один и тот же элемент, это не имеет значения.


Теперь интересная параллель может быть выполнена с интерпретируемыми языками. В интерпретируемом языке поиск имени будет задерживаться до момента, когда вызывается строка (или функция). Следовательно, это может повлиять на время выполнения (хотя еще раз, вероятно, не очень заметно).