C/C++程序内存分配

最近在做校招面试题,关于内存分配的问题整理如下。

C/C++编译程序内存分配

动态存储区
  • 栈区
    局部变量区,由编译器自动分配释放,存放函数的参数值,局部变量的值等。
  • 堆区
    动态存储区,malloc 申请的变量,手动申请,手动释放。
    使用malloc或者new进行堆的申请,堆的总大小为机器的虚拟内存的大小。
    new和malloc的区别如下:
    (1)malloc是C语言中的函数,而new是C++中的操作符。
    (2)malloc申请之后返回的类型是void*,而new返回的指针带有类型。
    (3)malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数。
静态存储区

静态存储区内变量在程序编译阶段已经分配好内存空间并初始化。这块内存在程序的整个运行期间都存在,它主要存放静态变量(static)、全局变量(global)和常量。
Tips:
(1)静态存储区内不存在未初始化的变量,编译器会以默认的方式进行初始化。
(2)静态存储区内的常量分为常变量和字符串常量,一经初始化,不可修改。
静态存储内的常变量是全局变量,与局部常变量不同,区别在于局部常变量存放于栈,实际可间接通过指针或者引用进行修改,而全局常变量存放于静态常量区则不可以间接修改。
(3)字符串常量存储在静态存储区的常量区,字符串常量的名称即为它本身,属于常变量。

代码区

存放程序体的二进制代码。

参考网上的示例代码
int a=0;    //全局初始化区
char *p1;   //全局未初始化区
main()
{
   int b;栈
   char s[]="abc";   //栈
   char *p2;         //栈
   char *p3="123456";   //123456\0在常量区,p3在栈上。
   static int c=0//全局(静态)初始化区
   p1 = (char*)malloc(10);
   p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。
   strcpy(p1,"123456");   
   //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
}

栈&堆申请效率比较

栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,但便于使用。

未完待续……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值