C语言(计算机专业应该知道的内存知识)

1.程序运行需要内存

(1)计算机程序 = 代码 + 数据,代码就是动作,就是加工数据的动作;数据就是数字,就是被代码所加工的东西。

(2)什么是内存: 内存实际上是一堆存储颗粒的集合, 每一个最小的内存单位可以储存0和1的数字状态, 内存是用来存储可变数据的.

(3)内存的基本单位: 内存单元的大小单位有4个:位(1bit) 字节(8bit) 半字(一般是16bit) 字(一般是32bit),在所有的计算机、所有的机器中(不管是32位系统还是16位系统还是以后的64位系统),位永远都是1bit,字节永远都是8bit.


2.内存编址和寻址、内存对齐

(1)内存编址方法: 内存在逻辑上就是一个一个的格子, 每个格子有一个编号,这个编号就是内存地址, 这个格子的空间(实质是一个空间)是一一对应且永久绑定的。这就是内存的编址方法。

(2)内存编址是以字节为单位的:这个大小是固定式,就是一个字节(8bit).

(3)内存和数据类型的关系: C语言中的基本数据类型有:char short int long float double

  • int 整形(整数类型,这个整就体现在它和CPU本身的数据位宽是一样的)譬如32位的CPU,整形就是32位,int就是32位;64位的CPU,int就是64位.

(4)内存对齐: 对齐访问很配合硬件,所以效率很高;非对齐访问因为和硬件本身不搭配,所以效率不高.

#include<iostream>
using namespace std;

struct A
{
 	char a;
 	short b;
 	int c;
};

struct B
{
	short b;
	int c;
	char a;
};

int main()
{
 	cout<<sizeof(A)<<endl;
 	cout<<sizeof(B)<<endl;
 	
 	return 0;
 }

运行结果为:
8
12


3.C语言对内存的访问与解析

(1)C语言对内存地址的封装(用变量名来访问内存、数据类型的含义)

譬如在C语言中, int a;    a = 5;      a += 4;		      // a == 9;

int a; // 编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的, 也不需要知道。),并且把符号a和这个格子绑定。

 a = 5; // 编译器发现我们要给a赋值,就会把5丢到符号a绑定的那个内存格子中。

 a += 4; // 编译器发现我们要给a加值,a += 4 等效于 a = a + 4;编译器会先把a原来的值读出来,然后给这个值加4,再把加之后的和写入a里面去。

(2)C语言中数据类型的本质含义是:表示一个内存格子的长度

数据类型决定长度的含义:我们一个内存地址(比如0x30000000),本来这个地址只代表1个字节的长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x30000000)就能表示从这个数字(0x30000000)开头的连续的n(4)个字节的内存格子了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)。

(3)用指针来间接访问内存:

C语言中的指针,全名叫指针变量,指针变量其实很普通变量没有任何区别。譬如int a和int *p其实没有任何区别,a和p都代表一个内存地址(譬如是0x20000000),但是这个内存地址(0x20000000)的长度和解析方法不同。
a是int型所以a的长度是4字节,解析方法是按照int的规定来的;p是int *类型,所以长度是4字节,解析方法是int *的规定来的(0x20000000开头的连续4字节中存储了1个地址,这个地址所代表的内存单元中存放的是一个int类型的数)。
总之,指针就是一个存储地址的一个普通变量。
 


4.两种结构:冯诺依曼结构和哈佛结构

  • 冯诺依曼结构是:数据和代码放在一起。(代码就是多个函数体,数据就是全局变量、局部变量)
  • 哈佛结构是:数据和代码分开存在。

比如在S5PV210中运行的linux系统上,运行应用程序时:这时候所有的应用程序的代码和数据都在DRAM(动态内存),所以这种结构就是冯诺依曼结构
单片机中,我们把程序代码烧写到Flash(NorFlash)中,然后程序在Flash中原地运行,程序中所涉及到的数据(全局变量、局部变量)不能放在Flash中,必须放在RAM(SRAM静态内存)中。 这种就叫哈佛结构


5.动态内存和静态内存

静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间,都无须程序员自行考虑。比如定义数组…

动态内存是程序员自己确定使用内存空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配,常用malloc申请,用完用free释放

区别:
a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。
b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。
c) 动态内存分配需要指针和引用类型支持,静态不需要。
d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值