Android内存管理
- - CSDN博客推荐文章首先Android内存管理机制相当复杂,想要讲清楚比较困难;其次对于绝大多数用户来说,只关心内存够不够用,至于内存如何管理的这种技术细节,不是用户需要去考虑的,写这样一个专题有没有意义. 毕竟我们是用手机,不是来研究手机的. 最后的顾虑是这个专题会不会太技术化了,绝大部分用户不会看或者说缺乏相应的背景.
c++使用3种不同解决方案存储数据,区别是数据保留在内存中的时间
两种存储持续性为自动:自动变量和寄存器变量(register没有内存地址)(堆栈)
分为3种链接性:
外部链接性,内部链接性和无链接性
所有静态变量都有下面的两个初始化特征:
1.未被初始化的静态变量的所有位数都被设置成0
2.只能使用常量表达式来初始化静态变量
对于链接性为外部的变量,有且只有一个文件中包含了该变量的外部定义。其他文件要引用该变量,必须在引用声明中使用关键字extern
#include <iostream>
//全局变量
using namespace std;
int globle = 10;//定义
int ab(int a,int b,int*p)
{
//extern int globle;//引用
int globle = 20;
cout<<"globle = "<<::globle<<endl;//::使用全局版本
*p =a-b;
return a+b;
}
存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
---|---|---|---|---|
自动 | 自动 | 代码块 | 无 | 在代码块中声明(可使用关键字auto) |
寄存器 | 自动 | 代码块 | 无 | 在代码块中使用关键字register |
静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中使用关键字static |
静态,外部链接性 | 静态 | 文件 | 外部 | 在函数外部 |
静态,内部链接性 | 静态 | 文件 | 内部 | 在函数外部使用关键字static |
用new操作符分配的内存将一直存在,直到使用delete操作符将其释放或程序终止
placement new操作符:
#include <iostream> #include <new>//1.引入new头文件 const int BUF = 512; const int N = 5; char buffer[BUF];//2. int main() { using namespace std; double * pd1,* pd2; cout<<"Calling new and placement new:\n"; pd1 = new double[N];// pd2 = new (buffer) double[N];//3.定义 for (int i =0 ;i<N;i++) pd2[i]=pd1[i] = 1000+20.0*i; cout<<"Buffer address:\n"<<"heap: "<<pd1<<" static: "<<(void*)buffer<<endl; cout<<"Bugger contents:\n"; for (int i=0;i<N;i++) { cout<<pd1[i]<<" at "<<&pd1[i]<<" ; "; cout<<pd2[i]<<" at "<<&pd2[i]<<endl; } double *pd3,*pd4; pd3 = new double[N]; pd4 = new (buffer) double[N]; for (int i=0;i<N;i++) pd4[i]=pd3[i]=1000+20.0*i; cout<<"Buffer contents:\n"; for (int i=0;i<N;i++) { cout<<pd3[i]<<" at "<<&pd3[i]<<" ; "; cout<<pd4[i]<<" at "<<&pd4[i]<<endl; } delete []pd1; delete []pd3; //delete pd2; 报错 布局new不能使用delete system("pause"); return 0; }