您的位置:首页 > 编程语言 > C语言/C++

C++ 初学者指南 第七篇(4)

2010-06-18 10:47 204 查看
转载请标明出处:http://blog.csdn.net/zhangxingping

必备技能7.4:寄存器变量

也许最常用的存储类型描述字就是register(寄存器)了。regitster描述字告诉编译器应该以尽可能快的访问方式来存储该变量。通常这意味着这个变量要么是存放在CPU的寄存器中要么是存放在缓存中。或许我们都知道,访问CPU中寄存器或者是缓存的速度要比访问内存的速度快很多。因此,访问寄存器中的变量的速度也要比访问随机存储器中变量的速度快很多。由于访问变量的速度和整个程序的执行速度有着密切的关系,慎重地选择使用寄存器变量是一项很重要的编程技巧。

从技术上来说,register描述字仅仅是告诉编译器需要把变量存储在寄存器中,但是编译器可以忽略这种要求。这样做的原因也是很容易理解的:寄存器的数量是有限的,而且寄存器的数量也和硬件的相关,因此,如果计算机的快速存储资源已经用完了,则变量就会被以正常的方式来存储。通常情况下,这样做是不会有什么问题的,当然此时使用寄存器存储方式的优点也就没有了。通常我们可以对至少两个变量来进行优化以提高速度。既然,能够用于快速访问的变量的数量是有限的,谨慎选择哪些变量应该用regitster来修饰就变得非常重要了。(只有正确地选择了用register修饰的变量,才能达到提高速度的目的)。一般情况下,一个变量被访问的频率越高,把这个变量设置为寄存器变量带来的速度优化效果也就越明显。正是基于这个原因,用于控制循环的变量或者是在循环中被访问的变量通常都是可以考虑被设置为寄存器变量的。

下面的示例程序中就使用了寄存器变量来提高函数summation()的效率。该函数用于计算一个数组中所有数值的和。在下面的程序中,我们假设只需要对两个变量进行速度的优化即可。

//演示register 修饰字
#include <iostream>
using namespace std;
int summation(int nums[], int n);
int main()
{
int vals[] = { 1, 2, 3, 4, 5 };
int result;
result = summation(vals, 5);
cout << "Summation is " << result;
return 0;
}
//返回整型数组中数值的和
int summation(int nums[],int n )
{
register int i;
register int sum = 0;
for( i = 0; i < n; i++ )
{
sum = sum + nums[i];
}
return sum;
}


其中,用于循环控制的变量i和用于在循环中访问的变量sum都被指定为寄存器变量。由于两者都是在循环中使用的变量,所以把它们限定为寄存器变量就可以达到预期的提高速度的目的。在这个程序中,我们假设了只能有两个变量被优化成是寄存器变量,因此我们只是对i和sum进行register的限定,而没有对n和nums进行寄存器变量的限定。然而,在允许更多变量可以被优化的情况下,我们也可以把n和nums变量设置成是寄存器变量来进一步提高程序的性能。

练习:

1. 一个静态的局部变量在函数被多次调用之间____其值。

2. 我们使用extern来声明一个可以不用定义的变量,对吗?

3.那个描述字要求编译器对变量的存储进行优化以提高程序的执行速度?

问专家

问:我在程序中的变量前增加了register描述字,但是我没有看到明显的程序执行速度的提高,这是为什么?

答:由于编译技术的不断进步,大部分的编译器都会自动对程序进行优化。因此,在很多情况下,在变量声明的前面增加register描述字是不会提高程序执行速度的,这是因为这些变量在没有增加register之前已经被优化了。然而,在某些情况下,使用register描述字还是有用的,因为这样实际上是告诉编译器我们认为对这些变量的优化是很重要的。特别是在函数中使用了大量变量的情况下,这样做是非常重要的,因为并不是所有的变量都会被优化。因此,尽管编译技术在不断提高,register描述字还是有着重要的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: