01 程序运行前
在程序编译后,生成了.exe
的可执行文件(当然这个 exe 是 windows 环境下的可执行程序了......),未执行程序前分为两个区域:
-
代码区
-
存放 cpu 执行的机器指令:也就是改为二进制(
0101
这样的)的代码(写完的代码会变成机器阅读的二进制)。 -
代码区是共享的:共享的目的是对于多次、频繁执行的程序,只会在内存中存有一份即可。(比如说生成完了 exe,多次点击执行,内存中只会留有一份这样的代码。)
-
代码区是只读的:让代码区只读的原因是防止程序意外的修改了它的指令。(所以说有些外挂是截取内存的,这样子来达到外挂的效果)
-
- 总结:代码区是用于存放 cpu 执行的机器指令。它由两个特点:共享和只读。
-
全局区
-
存放全局变量和静态变量。
-
什么是全局变量和局部变量?
如果一个变量定义在函数体内部,那么它就是局部变量。如果一个变量定义在函数体外部,那么就是全局变量。
值得注意的是,如果定义在
main
函数里面,也是局部变量。我们可以举个例子:
#include
using namespace std; int c = 10; int d = 20; int main() { int a = 10; int b = 20; system("pause"); return 0; } 那么在这个例子里面,全局变量是
c
d
,而局部变量是a
b
。 -
什么是静态变量?
在普通的变量前添加
static
就属于静态变量。#include
using namespace std; int main() { static int s_a = 100; static int s_b = 100; system("pause"); return 0; } 在这个例子里面,
s_a
s_b
就属于静态变量。
-
-
全局区内部有一个常量区,存放字符串常量和其他常量。
-
什么是字符串常量?
字符串常量就是用双引号(
""
)引起来的内容。比如说"helloworld"
"woshishabi"
这些就属于字符串常量。 -
什么是其他常量?
这里的其他常量就是指的是
const
修饰的变量(const
修饰之后就会变为只读)。但是,const 修饰的变量还要分为两个部分:- const 修饰的全局变量(也称做:全局常量)
- const 修饰的局部变量(也称做:局部常量)
我们可以举个例子:
#include
using namespace std; const c_g_a = 10; const c_g_b = 10; int main() { const c_l_a = 10; const c_l_b = 10; system("pause"); return 0; } 在这个例子里面,
c_g_a
c_g_b
就是 const 修饰的全局变量,也称之为全局常量。而c_l_a
c_l_b
是 const 修饰的局部变量,也称之为局部常量。
-
-
这个区域的数据,在程序运行结束后,由操作系统释放其内存。
我们可以用一段代码试一试:(具体可以翻源文件,这边把注释去掉了,注释内容就是上面的笔记)
#include
using namespace std; //创建全局变量 int c = 10; int d = 20; const int c_c = 10; const int c_d = 20; int main() { int a = 10; int b = 20; cout << "局部变量 a 的地址为:" << (int)&a << endl; cout << "局部变量 b 的地址为:" << (int)&b << endl; cout << endl; cout << "全局变量 c 的地址为:" << (int)&c << endl; cout << "全局变量 d 的地址为:" << (int)&d << endl; cout << endl; static int s_a = 100; static int s_b = 100; cout << "静态变量 s_a 的地址为:" << (int)&s_a << endl; cout << "静态变量 s_b 的地址为:" << (int)&s_b << endl; cout << endl; cout << "字符串常量的地址为:" << (int)&"hello world" << endl; cout << "字符串常量的地址为:" << (int)&"woshishabi" << endl; cout << endl; const int c_a = 100; const int c_b = 100; cout << "全局常量 c_c 的地址为:" << (int)&c_c << endl; cout << "全局常量 c_d 的地址为:" << (int)&c_d << endl; cout << endl; cout << "const修饰的变量 c_a 的地址为:" << (int)&c_a << endl; cout << "const修饰的变量 c_b 的地址为:" << (int)&c_b << endl; system("pause"); return 0; } 运行结果:
局部变量 a 的地址为:-810550588 局部变量 b 的地址为:-810550576 全局变量 c 的地址为:1195966464 全局变量 d 的地址为:1195966468 静态变量 s_a 的地址为:1195966472 静态变量 s_b 的地址为:1195966476 字符串常量的地址为:1195958080 字符串常量的地址为:1195958096 全局常量 c_c 的地址为:1195957168 全局常量 c_d 的地址为:1195957172 const修饰的变量 c_a 的地址为:-810550564 const修饰的变量 c_b 的地址为:-810550552 请按任意键继续. . .
仔细观察会发现,有些的内存是比较靠近的。而有些则不是。根据上面我们可以总结:
放在全局区的数据有:
- 全局变量
- 静态变量(ststic 关键字)
- 字符串常量
- 全局常量(const 修饰的全局变量)
没由存放在全局区的数据有:
- 局部变量
- 局部常量(const 修饰的局部变量)
-
- 总结:全局区存放:全局变量、静态变量和常量。而常量区存放:const 修饰的全局常量和字符串常量。
:-)