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