c++为什么要使用指针使用的作用是什么?堆栈全局变量。指针的用途,用变量直接访问数据不是更加不方便吗?这是因为在操作比较大型的数据和类的时候,由于指针可以通过内存地址来直接访问数据,从而避免了程序中复制大量的代码,因此指针的额效率最高。一般来说,指针会有三大用途。
1、处理堆中的存放的大型数据;
2、快速访问类的成员数据和函数;
3、一别名的方式向函数传递参数。
什么是栈和堆呢?
一般来说程序就是与数据打交道,在执行某一功能的时候,将数据加载到内存中处理。数据内存中的存放共分为以下几种形式:
1、栈区(stack)——由编译器自动分配并且释放,该区域一般放函数的参数值、局部变量的值等;
2、堆区(heap)——一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收;
3、寄存器区——用来保存栈顶指针和指令指针;
4、全局区(静态区)(static)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域中,程序结束后由系统释放。
5、文字常量区——常量字符串就是放在这里,程序结束后由系统释放;
6、程序代码区——存放函数体的二进制代码。
函数参数和局部变量存放在栈中,当函数运行结束并且返回时,所有的局部变量和参数就被系统自动清除掉了,为的是释放掉他们所占的内存空间。全局变量可以解决这个问题,但是全局变量永远不会被释放,而且由于全局变量为所有的类成员和函数所共享,所以它的值很容易被修改。使用堆可以一举解决这个问题。堆是采用匿名的方式保存数据的,我们只能通过指针的方式找到这些数据。
现在我们来比较一下堆栈的不同区别:
一、内存申请方式不同
(一)栈,由系统自动分配,例如我们在函数中声明的局部变量int a;那么,系统就会自动在栈中为变量a开辟空间
(二)堆,需要程序员自己申请,因此也需要指明变量的大小。
二,系统响应的不同
(一)栈,只有栈的剩余空间大于所申请的空间,系统将会为程序提供内存,否则将提示overflow,也就是内存溢出。
(二)堆,系统受到程序申请的空间的要求之后,会遍历操作系统用于记录内存空间空闲地址链表,当找到一个空间大于所申请的空间队结点后,就会将该结点从记录内存空闲地址的链表中删除,并将该结点的内存分配给程序,然后在这快内存区域的首地址处记录分配的大小,这样我们在使用delete来释放内存的时候,delete才能正确地识别并且删除该内存区域的所有变量,另外,我们申请的内存空间与堆结点上的内存空间不一定相等,这时系统就会自动将堆结点上多出来的那一部分内存空间收到空闲链表中。
三、空间大小的不同
(一)栈,在windows下,栈是一块连续的内存区域,它的大小是2m,也有的说是1m,总之该数值是一个编译时就确定的常数。是由系统预先根据栈顶和栈的最大容量定义好的,假如你的数据申请的内存空间超过栈的空间,那么就会提示overflow。所以别指望栈能存储比较大的数据。
(二)堆,堆是不连续的内存区域,个区域由链表将它们串联起来,它的上限是有系统中的有效的虚拟内存来定的。因此获得的空间比较大,而且获得的空间的方式也比较灵活。
四、执行效率不同
(一)栈
栈由系统自动分配,因此比较快。但是程序员不能对其进行操作。
(二)堆,堆是由程序员分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。
五、执行函数时的不同
(一)栈,在函数调用时,第一个进栈的是被调用函数的下一行的内存地址,其次是函数的参数,假如参数多于一个,那么次序是从右往左。最后才是函数的局部变量。
由于栈的先进后出的原则,函数结束的时候正好与其相反,首先是局部变量先出栈,然后是参数,次序是从左到右,这时局部变量都先出栈,指针自然地指到第一个进栈的那行内存地址,也就是被调用函数的下一行内存地址,程序更加该地址跳转到被调用函数下一行自动执行。另外由于栈的先进后出原则,它永远都不可能产生碎片。
(二)堆,堆是一大堆不连续的内存区域,在系统中由链表将它们串联起来,因此在使用的时候必须由程序员安排,它的机制是很复杂的,有时候为了分配一块合适的内存,程序员需要按照一定的算法在堆内存中搜索可用的足够大的空间,如果没有满足条件的空间,那么就要向系统发出申请增加一部分内存空间,这样就有机会分到足够大的内存,然后将计算后的数值返回。显然,堆的运行效率比栈要低得多,而且也容易产生内存碎片,但是好处就好似堆可以存储相当大的数据,并且一些细节也可以由程序员来安排。
总结,栈的内存小,但效率高,不过存储的数据只能在函数内有效,超出函数就消失了。堆的可存储空间非常大,但是容易产生碎片,效率也比较低,好处就是灵活性比较强,比如说我们需要创建一个对象,能够被多个函数所访问,但是又不想其成为全局的,那么这时候创建一个堆对象无疑使良好的选择。
由于堆和栈各有优缺点,因此好多时候我们是将堆和栈结合使用的,比如在存储一些比较大的数据时候,我们将数据存储在堆中,却将指向该数据的指针放在栈中。这样可以有效地提高程序的运行速度,避免不必要的内存碎片。不过在存储不大数据的时候我们一般使用栈,栈可以提高程序的运行速度。 本文链接地址: c++为什么要使用指针使用的作用是什么?堆栈全局变量