访问成员变量是 C++ 成员函数的通用操作。
编译器必须经常通过 this 指针从内存装入成员变量。因为值通过指针装入,所以编译器有时不能决定何时执行第二次装入或以前装入的值是否仍然有效。在这些情况下,编译器必须选择安全但缓慢的方法,在每次访问成员变量时重新装入成员变量。
如下所示,可以通过在局部变量中显式缓存成员变量的值来避免不必要的内存重新装入:
声明局部变量并使用成员变量的值初始化该变量。
在函数中成员变量的位置使用局部变量。
如果局部变量变化,那么将局部变量的最终值赋值到成员变量。不过,如果成员函数在该对象上调用另一个成员函数,那么该优化会产生不可预料的结果。
当值位于寄存器中时,这种优化最有效,而这种情况也与基元类型相同。基于内存的值的优化也会很有效,因为减少的别名使编译器获得了更多的机会来进行优化。
如果成员变量经常通过引用(显式或隐式)来传递,那么优化可能并没什么效果。
有时,类的目标语义需要成员变量的显式缓存,例如在当前对象和其中一个成员函数参数之间有潜在别名时。例如:
complex& operator*= (complex& left, complex& right) { left.real = left.real * right.real + left.imag * right.imag; left.imag = left.real * right.imag + left.image * right.real; } |
会产生不可预料的结果,前提是调用时使用:
x*=x; |