JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

7.  编译模板

8.  异常处理

9.  改善程序性能

9.1 避免临时对象

9.2 使用内联函数

9.3 使用缺省运算符

9.4 使用值类

9.4.1 选择直接传递类

9.4.2 在不同的处理器上直接传递类

9.5 缓存成员变量

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

9.5 缓存成员变量

访问成员变量是 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;