Skip to content

标题

CS-EASY-03 内存模型

C语言内存模型

在程序运行时,我们输入的数据、程序的中间数据、甚至是程序的命令本身,都是需要有内存去存放以供运行时进行处理的。一个由C/C++编译的程序占用的内存分为栈区(stack),堆区(heap),全局区(static)等区域,内存的不同区储存的数据的种类也不相同。具体表示如下:

内存分区具体含义
程序代码区 (code)
常量区 (constant)
全局数据区 (global data)
堆区 (heap)
动态链接库
栈区 (stack)

请结合上述说明与查阅相关资料,对内存模型进行概念理解,尝试解释以上分区的具体含义、应用场景和调用方式。

尝试回答下列导学问题:

  1. 什么是“栈溢出”?
  2. 堆区和栈区的区别是什么?
  3. 程序运行过程中,内存模型当中的哪些区是只读的,哪些区是可读写的?
  4. 如何使用malloc()、free()函数,它们针对的哪一个区进行操作?
  5. 为什么要对程序使用的内存进行管理?

请在本题的文档中对以上问题做出你的诠释。

内存模型的应用

对内存模型的更好认识,有助于我们在调度数据、优化程序运行效率等方面更加得心应手。小强在学习完内存模型的知识后,兴致勃勃地写出了如下程序

c
#include <stdio.h>
#include <stdlib.h>

const int constValue = 100;
const char* constString = "Hello, World!";
int globalVar = 10;

void function(int arg) {
    int localVar = 20;
    int *ptr = malloc(sizeof(int));
    *ptr = 30;
    free(ptr);
}

int main() {
    static int staticVar = 40;
    int localVarMain = 50;
    function(60);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>

const int constValue = 100;
const char* constString = "Hello, World!";
int globalVar = 10;

void function(int arg) {
    int localVar = 20;
    int *ptr = malloc(sizeof(int));
    *ptr = 30;
    free(ptr);
}

int main() {
    static int staticVar = 40;
    int localVarMain = 50;
    function(60);
    return 0;
}

小强想知道以下变量或对象的存储区域,请你协助小强完成他的答案,并解释为什么某些变量存储在特定的内存区域:

  • constValue
  • constString
  • globalVar
  • staticVar
  • localVar
  • ptr
  • localVarMain

注意,本题的变量名具有强提示作用,因此更加看重回答的逻辑性和相关概念的辨析,尽量避免直接套用定义的GPTlike行为。

例如,你可以采用输出变量或对象的地址的方式论证你的猜想,或者采用演绎方法论证“如果某对象不在xx区会有什么后果”。

浅谈Cache

Cache(缓存)是计算机体系结构中一个至关重要的组件,它位于CPU和主存(如DRAM)之间,是一种小容量、高速度的存储器,主要由SRAM组成。Cache的主要作用是减少CPU访问主存的次数,从而加快数据访问速度,提升系统整体性能。

你可能会对上述有关缓存的定义略有些摸不清头脑,这是因为有关计算机组成原理知识的缺乏。请你针对计算机系统、尤其是计算机硬件的组成结构进行学习,并回答下列问题

  1. 什么是冯诺伊曼体系结构?什么是现代计算机的组织结构?这两者的不同点在哪里?
  2. 主存储器是如何工作的?
  3. 什么是Cache的局部性原理?它包括哪些方面的内容?
  4. Cache的运用为什么可以加快系统整体性能?

你可以在文档中回答这些问题的同时,阐述你的学习心得与心路历程,相信对未知领域的学习不是仅靠回答现有问题就能实现的。

代码优化

小节任务对于源代码、目标程序均不设限制,要求使用本节题目中的知识对源代码进行优化,使得优化后的程序可以在不改变运行结果的情况下提高运行效率与鲁棒性。

提示:如何避免“爆栈”?怎样合理利用缓存?关于如何体现出程序的优化性能,你可以通过理论计算的方式,也可使用运行时间的数据结果说明。

本小节不提倡但也并不禁止“先射箭后画靶”的解决问题逻辑,但是希望同学们能够在更多的编程场合内化运用计算机系统的有关知识写出更“漂亮”的代码。

本题提交方式

提交点这里

主题示例:2024090101012-张三-CS-03

本题出题人:奶绿丶(单艺豪) QQ:3073494764