loading请求处理中...

C/C++程序内存分配

2021-12-02 05:48:33 阅读 10073次 标签: c#开发基础 作者: 蓝blue

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

动态存储区

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

静态存储区

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

代码区

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

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

栈&堆申请效率比较

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

开发公司推荐

成为一品威客服务商,百万订单等您来有奖注册中

留言( 展开评论

快速发任务

价格是多少?怎样找到合适的人才?

官方顾问免费为您解答

 
相关任务
DESIGN TASK 更多
可视化展示工具,开发

¥1000 已有2人投标

剑网三自动招募软件开发

¥20000 已有0人投标

微信小程序后台系统开发

¥20000 已有0人投标

BitSKY-APP项目开发

¥100 已有2人投标

现成的获客系统开发

¥5000 已有0人投标

php后台继续开发

¥1000 已有8人投标