c++ 内存控制

2.存储持续性,作用域和链接性
2.1.自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。在函数被调用时创建,函数调用结束时释放。

程序留出一段内存,并将其视为栈,以管理变量的增减。之所以被称为栈,是由于新数据被象征性的放在原有数据的上面,当程序使用完之后,将其从栈中删除。栈的默认长度取决于实现,但编译器通常提供改变栈长度的选项。程序使用两个指针来找栈,一个指针指向栈底(开始位置),另一个指针指向栈顶(下一个可用的内存单元)。当函数被调用时,其自动变量将被加到栈中,栈顶指针指向指向变量后面的下一个可用的内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而释放新变量使用的内存。

栈是LIFO(后进先出)的,既最后加入到栈中的变量首先被弹出。函数调用将其参数的值放在栈顶,然后重新设置栈顶指针。

2.2静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量存储持续性都为静态。它们在整个程序运行过程中都存在。

和c一样,c++也为静态存储持续性变量提供了3中链接性
1)外部链接:可在其他文件中访问,在代码块外面声明
可以使用extern在多个文件中导入某个文件的变量
2)内部链接:只能在当前文件中访问,在代码块外面声明,并使用static限定符
多个文件可以重名
3)无链接性:智能在当前函数或代码块中访问,在代码块内部声明,并使用static限定符

由于静态变量的数目在程序运行期间是不变的,因此程序不需要使用特殊的位置(如栈)来管理他们。编译器将分配固定的内存块来存储多有的静态变量,这些变量在整个程序执行期间一直存在。另外,如果没有显式的初始化静态变量,编译器会将他们设为0.

说明符和限定符:
1.auto
2.register
3.static
4.extern
5.thread local
6.mutable

函数和链接性
和c语言一样,c++不允许在一个函数中定义另外一个函数,因此所有的函数的存储持续性都是静态的,即在整个程序执行期间都在.函数的链接性为外部的,可以在文件间共享.
可以在函数原型中使用关键字extern来支出函数是在另一个文件中定义的.
还可以使用关键字static将函数的链接性设置为内部的,使之只能在一个文件中使用,必须同时在原型和函数定义中使用关键字:

static int private(double x);
static int private(double x)
{
}
//这意味着该函数值在这个文件中可见,还意味着可以在其他文件中定义同名的函数.和变量yiyang

c++调用函数寻找
如果函数原型指出该函数是静态的,则编译器只在改文件中查找函数定义;
否则将在所有文件中查找,如果找到两个定义,会报错,因为外部函数只能有一个定义,
如果在程序文件中没有找到,则会在库中寻找.

线程存储持续性(c++11):多核处理器同时处理多个执行任务。这让程序能够将计算放在可并行处理的不同线程中。如果变量是使用关键字thread_local声明的,则其声明周期与所属的线程一样长。

动态存储持续性:用new运算符分配的内存将一直存在,指导使用delete运算符将其释放或程序结束为止。即堆存储(heap)

编译器使用三块独立的内存:一块用于静态变量,一块用于自动变量,一块用于动态存储

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值