主要内容 #
经过前面的课程学习,我们现在可以给出数据在内存中,真正的样子。
1. 内存的真实样子 #
上图中,要注意的地方有:
2. 内存模型,合并表示 #
我们建立模型的作用,是为了更容易地讨论一些问题。
现在我们给出来的,是最基本的内存模型。请务必理解:它可以看作“bool 变量在内存中的分布”。
那么,由于 C++ 中还有很多其他的数据类型,怎么用模型表示它们呢?
// 一般也写作 地址 | ... | 0x7cff15e8 | 0x7cff15f0 | 0x7cff15f8 | ... | 数值 | ... | 202 | 214 | 148 | ... |
// 一般也写作 地址 | ... | 0x7cff0000 | 0x7cff0010 | 0x7cff0020 | ... | 数值 | ... | 20211 | 202 | 148 | ... |
// 一般也写作 地址 | ... | 0x7cff0000 | 0x7cff0020 | 0x7cff0040 | ... | 数值 | ... | 202 | 214 | 148 | ... |
// 一般也写作 地址 | ... | 0x7cff0000 | 0x7cff0040 | 0x7cff0080 | ... | 数值 | ... | 202 | 214 | 148 | ... |
3. 小实验 – 感受内存大小 #
我们现在做一个实验,向操作系统申请 400 MB 的内存。
首先,请计算一下,
假如我们使用 char 类型的数组,400 MB 应该对应多少长度的数组呢? 请思考并计算。 /* */
解析:
一个 char 的大小,正好是一个字节。 400 MB 是 400 * 1024 * 1024 B,所以,数组的长度应该为 400 * 1024 * 1024
在这个实验中,由于需要申请的数组大小,超过了操作系统能够自动分配的上限(Windows 1MB,Linux 10 MB),
所以我们将使用 new 。new 不作为大家需要掌握的语法知识,在这里将它理解为普通的数组初始化即可。
请打开任务管理器,监控程序的内存变化。
请使用 Visual Studio 2015 运行如下代码
#include < iostream > using namespace std; int main() { cout << "请找到当前程序的进程,记录当前的内存使用量。" << endl; cout << "请输入任意一个字符,然后点击回车。" << endl; char key; cin >> key; //【注意】在这里,cin 用作一个程序暂停 // 测试 400 MB 的数据 cout << "正在申请 400 MB 的内存空间。" << endl; char* data = new char [400 * 1024 * 1024]; cout << "请再次找到当前程序的进程,记录当前的内存使用量。" << endl; cout << "请再输入任意一个字符,然后点击回车,释放 400 MB 内存。" << endl; cin >> key; delete[] data; cout << "请再输入任意一个字符,然后点击回车,结束程序。" << endl; cin >> key; return 0; }
大家也可以尝试一下,使用 short / int / double 等不同长度的数据类型,向操作系统申请总大小为 400 MB 的数组。