zoukankan      html  css  js  c++  java
  • C++内存管理

    C++ 中内存可以分为5部分:

    内存管理是指软件运行时对计算机内存资源的分配和使用的技术。

    全局/静态存储区、常量存储区、栈(stack)、堆(heap)、自由存储区(free store)

    全局/静态存储区:

    定义在花括号外{ }的变量、或是使用static修饰的变量。

    常量存储区:

    如字符串常量“ABC”等,通常存放在常量存储区。

    栈(stack):

           花括号{ }内定义的变量、函数的形参等。

    程序执行到花括号内时,变量创建在栈上,当括号内程序执行结束,栈上的变量由编译器自动释放。

    堆(heap):

    malloc分配的内存块。

    自由存储区(free store):

    new分配的内存块。

    栈与堆

    栈由编译器自动管理,堆由程序员管理。

    默认的栈空间大小是1M,堆内存可以达到4G的空间,其大小可以修改(?)。

    栈一般情况下不会产生碎片,堆很有可能会产生碎片。

    堆与自由存储区的区别(并不等价)

    堆(heap)是C语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,稍后调用free可把内存交还。

    自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区。

     

    如下使用一个例子最直观

    #include<iostream>
    #include<string>
    using namespace std;
    
    int global_par;                //全局变量 默认初始化为0
    
    int main() {
        int local_par=0;           //局部变量 不会初始化 最好进行初始化
        static int static_par=0;   //静态局部变量   
        int *q1 =(int *)malloc(int(1));   //指针q1本身是局部变量  malloc在堆上开闭空间
        int *q2 = (int *)malloc(int(10));
        int *p1 = new int(1);            //指针p1本身是局部变量  new在自由存储区上开闭空间
        int *p2 = new int(10);
    
        cout << "-----全局/静态存储区----" << endl;
        cout << "global_par地址:" << &global_par << endl;
        cout << "static_par地址:" << &static_par << endl;
        cout << endl;
    
        cout << "-----常量存储区-----" << endl;
        cout << "A地址:" << &"A" << endl;
        cout << "e地址:" << &"e" << endl;
        cout << endl;
    
        cout << "-------栈-------" << endl;
        cout << "local_par地址:" << &local_par << endl;
        cout << "*q1地址:" << &q1 << endl;
        cout << "*q2地址:" << &q2 << endl;
        cout << "*p1地址:" << &p1 << endl;
        cout << "*p2地址:" << &p2 << endl;
        cout << endl;
    
        cout << "--------堆--------" << endl;
        cout << "(int *)malloc(int(1))的地址:" << q1 << endl;
        cout << "(int *)malloc(int(10))的地址:" << q2 << endl;
        cout << endl;
    
        cout << "-----自由存储区-----" << endl;
        cout << "new int(1)的地址:" << p1 << endl;
        cout << "new int(10)的地址:" << p2 << endl;
        cout << endl;
    
        free(q1);
        free(q2);
        delete p1;
        delete p2;
    
        system("pause");
        return 0;
    
    }

    运行结果如下:

    从上图中的不同变量的地址可以看出不同类型变量地区存储在不同区域。

    内存对齐

    相关链接:

    https://www.cnblogs.com/QG-whz/p/5060894.html

    https://blog.csdn.net/caogenwangbaoqiang/article/details/79788368

  • 相关阅读:
    java之认识基本数据类型及其封装类装箱和拆箱总结
    java之集合类特性对比分析列表
    <转>泛型的内部原理:类型擦除以及类型擦除带来的问题
    java之集合类框架的简要知识点:泛型的类型擦除
    java之方法覆盖的坑
    java入门概念个人理解之访问修饰符
    blog开篇
    卓越管理的实践技巧(4)如何才能给予有效的反馈 Guide to Giving Effective Feedback
    权限管理系统之组织管理
    卓越管理的实践技巧(3)推动团队管理的要点 Facilitation Essentials for Managers
  • 原文地址:https://www.cnblogs.com/dreammmz/p/13341257.html
Copyright © 2011-2022 走看看