跳至正文
View Categories

1 min read

主要内容 #

经过前面的课程学习,我们现在可以给出数据在内存中,真正的样子。

1. 内存的真实样子 #


上图中,要注意的地方有:

  • 内存地址是递增 1 变化的
  • 使用 1 / 0 来表示“有电/没电”状态
  • 这里演示的是 32 位计算机上的内存地址
  • 2. 内存模型,合并表示 #

    我们建立模型的作用,是为了更容易地讨论一些问题。
    现在我们给出来的,是最基本的内存模型。请务必理解:它可以看作“bool 变量在内存中的分布”

    那么,由于 C++ 中还有很多其他的数据类型,怎么用模型表示它们呢?

  • char / unsigned char ,请注意,内存地址是递增 8 变化
  • // 一般也写作
    地址 | ... | 0x7cff15e8 | 0x7cff15f0 | 0x7cff15f8 | ... |
    数值 | ... | 202        | 214        | 148        | ... |
  • short / unsigned short ,请注意,内存地址是递增 16 变化
  • // 一般也写作
    地址 | ... | 0x7cff0000 | 0x7cff0010 | 0x7cff0020 | ... |
    数值 | ... | 20211      | 202        | 148        | ... |
  • int / unsigned int / long / unsigned long / float,请注意,内存地址是递增 32 变化
  • // 一般也写作
    地址 | ... | 0x7cff0000 | 0x7cff0020 | 0x7cff0040 | ... |
    数值 | ... | 202        | 214        | 148        | ... |
  • int / unsigned int / long / unsigned long / float,请注意,内存地址是递增 64 变化
  • // 一般也写作
    地址 | ... | 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 的数组。

    习题 #

    课后练习