使用'this->'成员变量访问的性能

performance of member variable access with 'this->'

本文关键字:访问 性能 变量 gt this- 使用 成员      更新时间:2023-10-16

我刚刚和我的 cpp 导师就这个this->与"只是名称"的成员变量访问进行了激烈的讨论。

class Test{
int a;
int data[50000000];
int b;
Test(int c,int d){
a=c; //or this->a=c;
b=d; //or this->b=d;
}
};

他的理解是,纯名称意味着对成员变量的引用,而使用this->扩展到(*this).,后者我同意。 出于性能原因,您将使用对变量的引用,因为引用的指针在仅访问一个部分之前将整个对象复制到适当的位置。 由于这发生在 Everthis->上,这将对性能产生相当糟糕的影响。

但是我尝试了两个版本,翻译成汇编,没有区别。 这是为什么呢?(我不习惯组装到足以理解整个上下文,所以我不知道)

在这种情况下,编译器是否没有使用引用,而是使用更类似于取消引用的东西,或者在这种情况下,取消引用只是没有做我希望它做的事情?(我们一直在谈论 C++11,如果这很重要的话)

访问非静态成员函数中带有和不具有this->的成员会导致相同的机器代码。后者是前者的句法糖。代码

class A {
public:
int a;
A() {
a = 1;
}
};
class B {
public:
int b;
B() {
this->b = 1;
}
};
int main() {
A a;
B b;
return 0;
}

未经优化转换为

main:                                   # @main
push    rbp
mov     rbp, rsp
sub     rsp, 16
mov     dword ptr [rbp - 4], 0
lea     rdi, [rbp - 8]
call    A::A() [base object constructor]
lea     rdi, [rbp - 16]
call    B::B() [base object constructor]
xor     eax, eax
add     rsp, 16
pop     rbp
ret
A::A() [base object constructor]:                              # @A::A() [base object constructor]
push    rbp
mov     rbp, rsp
mov     qword ptr [rbp - 8], rdi
mov     rax, qword ptr [rbp - 8]
mov     dword ptr [rax], 1
pop     rbp
ret
B::B() [base object constructor]:                              # @B::B() [base object constructor]
push    rbp
mov     rbp, rsp
mov     qword ptr [rbp - 8], rdi
mov     rax, qword ptr [rbp - 8]
mov     dword ptr [rax], 1
pop     rbp
ret

取消引用指针不会复制对象,但会生成对该对象的引用。否则代码类似

int a(0);
int pa = &a;
*pa = 12;
std::cout << a << 'n'; // prints 12

无法按预期工作。此外,此访问是通过引用的:

class A {
public:
int a(0);
int b(0);
int c(0);
A() {
a = 1;
this->b = 2;
(*this).c = 3;
std::cout << a << " " << b << " " << c << 'n'; // prints 1 2 3
}
};

如果是副本,则无法设置成员变量的值。每次可以更改原点的值时,它都是引用而不是副本。