一些相似概念的区分

1、const 与 #define
Const与#define都可用来定义常量。
(1)处理方式。#define是在预处理阶段进行替换,const是在编译运行阶段使用
(2)定义的常量类型不同
define定义的常量没有类型,因此也不会进行类型安全检查。
const定义的常量有类型,能够进行类型安全检查。
(3)存储方式不同
define定义的常量不会分配内存,而是使用多少次,就替换多少次,会在内存中有若干个拷贝。
const定义的常量会分配内存,在程序运行时只会进行一份拷贝。
2、new 与malloc
New/delete和malloc/free都可用于动态分配与申请内存。
(1)两者的基本概念不同
Malloc/free是C++/C语言的标准库函数。
new/delete是C++的运算符。
(2)功能作用不同
Malloc/free是库函数,不能够执行构造函数和析构函数。
New/delete在C++中是运算符,能够执行构造函数和析构函数,完成初始化和清理工作。
(3)返回类型不同
Malloc返回的是void型指针。
New返回的指针带有类型信息
3、堆内存 与 栈内存
堆栈是一种数据结构的概念,一种数据项按序排列的数据结构,堆内存(heap)与栈内存(stack)是不同于数据结构中的堆栈,下面是C/C++中堆内存与栈内存的区别。
(1)地址增长方式
栈区地址是向下增长,堆区的士是向上增长的。
(2)内存分配方式不同
栈是系统自动分配内存,如定义一个变量,int a;堆是自己申请的空间,如使用malloc/new定义出的变量,p = (char *)malloc(10);
(3)申请后系统的响应
对于栈内存,只要剩余空间大于所申请内存大小,就会为程序分配内存,否则就会导致栈溢出。
对于堆内存,系统会遍历链表(记录空闲内存地址的链表),寻找第一个内存大于所申请空间的堆,多与的空间会重新放入链表中。
(4)申请效率的不同
栈内存由系统自动分配,速度较快,但程序员无法控制。
堆内存有自己申请分配,速度较慢,容易产生内存碎片。
(5)申请大小限制
栈内存是一块连续的空间,其栈顶地址地址和栈的最大容量是系统提前分配好的。Windows系统下的大小一般为1M或2M,可使用空间比较小。
堆内存是不连续的空间,其大小受限与系统的虚拟内存,可用空间比较大。
(6)存储内容的不同
栈内存在函数调用时,第一个进栈的是主函数中的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。(即存放主函数中的可执行语句、参数、局部变量)
堆内存一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值