软件开发中几种基本概念区别

一.  声明与定义

在 C 语言开发中,声明与定义是有本质上的区别的。

定义一个变量:告诉编译器需要为该变量分配空间。

声明一个变量:告诉编译器需要使用该变量,但该变量在其他位置被定义。

二. 栈与堆的区别

栈是由编译器在程序运行时分配的空间,由操作系统维护。在 C 语言开发中,堆是由 malloc() 函数分配的内存块(C++ 中为 new 运算符),内存的管理由程序员手动分配,释放时使用 free() 函数来完成(C++ 中为 delete 运算符)。

栈与堆的区别主要有以下几点:

1.  分配方式不同:

栈的分配与释放是由操作系统自动完成的。堆需要程序员手动申请与释放。

2. 分配效率不同:堆的分配效率比栈低。

栈是系统提供的,操作系统会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行。

堆则是由 C 函数库提供的,它的机制很复杂。例如,为了分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大的空间,如果没有足够大的空间,则需要操作系统来重新整理内存空间,这样就有机会分到足够大小的内存,然后返回。

3. 地址增长方向不同:

在 x86平台上,栈的增长方向是向下的吗,即向着内存地址减小的方向。堆的增长方向是向上的,即向着内存地址增加的方向。

4. 内存地址是否连续:

栈是向低地址扩展,是一块连续的内存区域。即栈顶的地址和栈的最大容量是系统预先规定好的。当申请的栈空间超过栈的剩余空间时,将会出现栈溢出错误。

堆是向高地址扩展的。是不连续的内存区域,因为系统是用链表来存储空闲内存地址的,而且链表的遍历方向是从低地址向高地址的。

5. 产生碎片不同:

对于栈来讲,申请的一定是连续的内存空间。

而对于堆而言,频繁的 malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低(虽然程序在退出后,操作系统会对内存进行回收管理)。

三. 内存分配方式

在C语言开发中,数据可以使用静态(如数据段,BSS段)或动态分配(堆)的方式,进行内存空间分配。

静态分配:编译器在编译程序源代码时分配,例如全局变量与静态变量。

动态分配:程序在执行时调用malloc()或calloc()函数,动态分配堆空间。

静态分配与动态分配的区别如下:

1. 效率方面不同:

静态内存分配是在程序执行之前进行的,效率比较高。而动态内存分配则可以灵活的处理未知数目的内存空间申请。

2. 操作方式不同:

静态变量是有名字的,可以直接对其进行操作。而动态分配的内存是没有名字,需要通过指针间接的对其进行操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值