c++使用3种不同解决方案存储数据,区别是数据保留在内存中的时间
1.自动存储持续性
两种存储持续性为自动:自动变量和寄存器变量(register没有内存地址)(堆栈)
2.静态存储持续性
在函数外定义的变量和使用关键字static定义的变量的存储持续性都为静态.
分为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 |
- /*
- *C++的存取修饰符
- *主要有:const--常数型,volatile--暂态型
- *1.const--常数型
- *const型变量在程序执行期间是不可以改变的,编译程序可以随意的将这些变量放到只读存储器Rom中
- *const用途:可以阻止参数被修改,即当一个指针传送给一个函数后,函数可能修改该指针所指向的变量,然而,如果指针在参数说明段
- *用const修饰,函数就无法修改指针所指的内容了。
- *通常,当一个标准库函数不必修改调用参数指引的对象时,参数则用const来修饰,
- *2.volatile
- *volatile通知编译器:变量值可能由程序中没有显示说明的方式所改变。
- *全局变量的地址可能被传递到操作系统的时针子程序,用来保存系统实时时间。
- *引用修饰符volatile的原因:大多数C编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。
- *有些编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。有些编译程序在编译时还有改变表达式的计算顺序,volatile
- *可以防止这些改变发生。
- *const 和volatile可以一起使用,例如:如果假定0x80是仅由外部条件改变的端口的值,那么下面说明既可以消除用户希望防止的说有偶发副作用:
- *const volatile unsigned char * port=0x80;
- */
3.动态存储持续性
用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; }