C++中自动变量与auto关键字的一些说明

C++中自动变量与auto关键字的一些说明

在 C++11 中,关键字 auto用于自动类型推断,这在第3、7和8章介绍过。但在C语言和以前的 C++版本中,auto的含义截然不同,它用于显式地指出变量为自动存储:

int froob(int n)
{
    auto float ford; //ford has automatic storage
    ...
}

由于只能将关键字 auto 用于默认为自动的变量,因此程序员几乎不使用它。它的主要用途是指出当前变量为局部自动变量。
在 C++11中,这种用法不再合法。制定标准的人不愿引入新关键字,因为这样做可能导致将该关键字用于其他目的的代码非法。考虑到 auto的老用法很少使用,因此赋予其新含义比引入新关键字是更好的选择。

可以使用任何在声明时其值为已知的表达式来初始化自动变量,下面的示例初始化变量 x、y和 z:

int w;                 //value of w is indeterminate
int x=5;               //initialized with a numeric literal
int big = INT_MAX - 1; //initialized with a constant expression
int y=2 * x;           // use previously determined value of x
cin >> W;
int 2 = 3 * w;         //use new value of w

了解典型的 C++编译器如何实现自动变量有助于更深入地了解自动变量。由于自动变量的数目随函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理。常用的方法是留出一段内存,并将其视为栈,以管理变量的增减。之所以被称为栈,是由于新数据被象征性地放在原有数据的上面(也就是说,在相邻的内存单元中,而不是在同一个内存单元中),当程序使用完后,将其从栈中删除。栈的默认长度取决于实现,但编译器通常提供改变栈长度的选项。程序使用两个指针来跟踪栈,一个指针指向栈底–栈的开始位置,另一个指针指向堆顶–下一个可用内存单元。参见【0voice C++】当函数被调用时,其自动变量将被加入到栈中,栈顶指针指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。

栈是LIFO(后进先出)的,即最后加入到栈中的变量首先被弹出。这种设计简化了参数传递。函数调用将其参数的值放在栈顶,然后重新设置栈顶指针。被调用的函数根据其形参描述来确定每个参数的地址。例如,图9.3 表明,函数 fb( )被调用时,传递一个2字节的int 和一个4字节的long。这些值被加入到栈中。当 fib()开始执行时,它将名称real 和 tel 同这两个值关联起来。当 fb()结束时,栈顶指针重新指向以前的位置。新值没有被删除,但不再被标记,它们所占据的空间将被下一个将值加入到栈中的函数调用所使用(图9.3做了简化,因为函数调用可能传递其他信息,如返回地址)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值