使用'this->'成员变量访问的性能
performance of member variable access with 'this->'
我刚刚和我的 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
}
};
如果是副本,则无法设置成员变量的值。每次可以更改原点的值时,它都是引用而不是副本。
相关文章:
- 通过方法访问结构
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 以这种方式在运行时访问元组的性能成本
- 附加到 C++/CLI dll 的性能探查器无法访问本机C++代码
- 访问说明符和性能
- 使用'this->'成员变量访问的性能
- 提高访问大型数组元素的性能
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- 提高 OpenCV 中垫像素访问的性能
- 通过Delphi访问Windows API是否会导致性能损失
- 如何以编程方式访问c/c++a-la-rdtsc中的性能计数器
- 堆上的分配是否会影响访问性能
- 矢量元素的访问性能如何
- 迭代器性能的重点应该放在高级还是元素访问上
- 如何在c++中访问映射中的映射.?性能问题
- 私有访问修饰符和公共访问修饰符在性能上有区别吗?
- 与指针相比,链式公共成员访问的性能
- 访问堆与堆栈对象的C++性能
- 访问堆成员和堆栈对象之间的性能差异
- 通过引用或指针访问的性能差异