主页 » 正文

C++中栈与函数调用的关系

十九科技网 2025-05-21 14:09:03 251 °C

一、C++中栈与函数调用的关系

C++ 堆栈与函数调用 时间: 16:52来源:未知 作者:看看Linux 点击:859次 一 C++程序内存分配 1) 在栈上创建。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。 2) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。 3) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 4) 文字常量分配在文字常量区,程序结束后由系统释放。 5)程序代码区。 经典实例: #include<string> inta=0; //全局初始化区 char *p1; //全局未初始化区 voidmain() { intb;//栈 chars[]=abc; //栈 char *p2; //栈 char *p3=123456; //123456\0在常量区,p3在栈上。 static intc=0; //全局(静态)初始化区 p1=(char*)malloc(10); p2=(char*)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1,123456); //123456\0放在常量区,编译器可能会将它与p3所向123456\0优化成一个地方。 } 二三种内存对象的比较 栈对象的优势是在适当的时候自动生成,又在适当的时候自动销毁,不需要程序员操心;而且栈对象的创建速度一般较堆对象快,因为分配堆对象时,会调用operator new操作,operator new会采用某种内存空间搜索算法,而该搜索过程可能是很费时间的,产生栈对象则没有这么麻烦,它仅仅需要移动栈顶指针就可以了。但是要注意的是,通常栈空间容量比较小,一般是1MB~2MB,所以体积比较大的对象不适合在栈中分配。特别要注意递归

函数中最好不要使用栈对象,因为随着递归调用深度的增加,所需的栈空间也会线性增加,当所需栈空间不够时,便会导致栈溢出,这样就会产生运行时错误。 堆对象创建和销毁都要由程序员负责,所以,如果处理不好,就会发生内存问题。如果分配了堆对象,却忘记了释放,就会产生内存泄漏;而如果已释放了对象,却没有将相应的指针置为NULL,该指针就是所谓的“悬挂指针”,再度使用此指针时,就会出现非法访问,严重时就导致程序崩溃。但是高效的使用堆对象也可以大大的提高代码质量。比如,我们需要创建一个大对象,且需要被多个函数所访问,那么这个时候创建一个堆对象无疑是良好的选择,因为我们通过在各个函数之间传递这个堆对象的指针,便可以实现对该对象的共享,相比整个对象的传递,大大的降低了对象的拷贝时间。另外,相比于栈空间,堆的容量要大得多。实际上,当物理内存不够时,如果这时还需要生成新的堆对象,通常不会产生运行时错误,而是系统会使用虚拟内存来扩展实际的物理内存。 静态存储区。所有的静态对象、全局对象都于静态存储区分配。关于全局对象,是在main()函数执行前就分配好了的。其实,在main()函数中的显示代码执行之前,会调用一个由编译器生成的_main()函数,而_main()函数会进行所有全局对象的的构造及初始化工作。而在main()函数结束之前,会调用由编译器生成的exit函数,来释放所有的全局对象。比如下面的代码: void main(void) { … …// 显式代码 } 实际上,被转化成这样: void main(void) { _main(); //隐式代码,由编译器产生,用以构造所有全局对象 … … // 显式代码 … … exit() ; // 隐式代码,由编译器产生,用以释放所有全局对象 }

二、关于精算数学 定期保险APV计算

5E35=v^5*5p35

v=1/(1+i)

5E35是相当于FM里面的discount factor d,但是把人的死亡率也考虑进去了

三、硬盘模式IDE,RAID,AHCI有什么区别

主要区别如下:

1、传输速度不同。AHCI的传输速度最快。

2、传输方式不同。

3、工作原理不同。RAID能叠加硬盘容量,避免浪费。IDE只可以内置使用。

4、价格相差较大。IDE价格最为低廉。

扩展资料

磁盘阵列其样式有三种,一是外接式磁盘阵列柜、二是内接式磁盘阵列卡,三是利用软件来仿真。

外接式磁盘阵列柜最常被使用大型服务器上,具可热交换(Hot Swap)的特性,不过这类产品的价格都很贵。

内接式磁盘阵列卡,因为价格便宜,但需要较高的安装技术,适合技术人员使用操作。硬件阵列能够提供在线扩容、动态修改阵列级别、自动数据恢复、驱动器漫游、超高速缓冲等功能。它能提供性能、数据保护、可靠性、可用性和可管理性的解决方案。阵列卡专用的处理单元来进行操作。

利用软件仿真的方式,是指通过网络操作系统自身提供的磁盘管理功能将连接的普通SCSI卡上的多块硬盘配置成逻辑盘,组成阵列。软件阵列可以提供数据冗余功能,但是磁盘子系统的性能会有所降低,有的降低幅度还比较大,达30%左右。因此会拖累机器的速度,不适合大数据流量的服务器。

参考资料来源:百度百科:RAID

版权声明:部分内容由互联网用户自发贡献,如有侵权/违规,请联系删除
本平台仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

本文链接地址:/dsj/213382.html

相关文章