内存编址、寻址、内存对齐

朱老师物联网大讲堂学习笔记

1、内存编址方法

    内存在逻辑上是一个个格子,格子占有空间,可以用来存储数据,每个格子有编号,编号就是内存的地址,地址和格子空间是一一对应且永久绑定的。程序运行时,CPU只关心地址,不关心这个地址所代表的空间在哪里,怎么分布这些实体问题。有地址就一定能够找到对应的内存单元(内存单元:包括内存地址和空间)。地址是固定的,空间中存储的东西是变动的,这和数组做左右值相关?

  关键:内存编址以 字节 为单位。比如给定一个内存地址7,其对应的空间大小就是固定的8bit,是定死的。一定要记住,以后学习指针的时候很重要。就好比宾馆一样,房间号(地址)不同每个房间都是标准的大床房(所占单位空间都一样),没有双人间,都是标标准的大床房,面积都一样,至于里面住什么人,看存的是啥。

2、内存和数据类型的关系

  c语言的数据类型有:char、short、int、long、float、double

  int(整型,整数类型,整体现在它和CPU的数据位宽是一样的,如32位CPU,int就是32位,4byte)

  二者关系:数据类型是用来定义变量的,而这些变量需要存储、运算、在内存中。所以数据类型必须和内存匹配,才能获得最好性能 ,否则可能不工作或者效率低下。
  在32位系统中定义变量最好用int,因为这样效率高,32位的系统本身配合内存也是32位,这样的配置天生适合定义32位int变量(软硬结合理解),效率高,当然其他的类型也能定义,但是访问效率不高,比如定义8位的char,比32位的效率低。

  在很多32位环境下,定义bool变量,实际只需要一个bit位,但我们定义时,都是用int来实现bool。例如:我们定义一个 bool b1; 时,编译器实际帮我们分配了32 位的内存来帮我们存储这个变量,虽然浪费了31位,但是效率高。 现在硬件便宜,偏向效率。其实,这要具体情况具体分析。

3、内存对齐

  例如int:

  图1这种是对齐访问,类似图2/3这种是非对齐访问,逻辑虽然相同,都是int,32bit,但是对存的对齐访问 不是逻辑问题,是硬件问题。

  硬件角度讲:32bit的内存它 0 1 2 3 四个单元本身逻辑上就有相关性,这四个字节合起来当做一个int,硬件上就是合适的,效率就高,why?比如4人去出差,大家肯定希望在同一楼方便,如果隔了一层楼之类的,那肯定就是不方便了,虽然编号相连,但实际可能不相连,0 1 2 3 天生硬件就是连接的,而1 2 3 4就可能就不是相连的,效率就可能不高,但是一般硬件都是提供非对齐访问的,但实际效率不高,现在一般内存访问,有内存,有钱,不差那一点。

4、从内存编址看数组的意义

  数组就是拿一段内存空间出来。完全可以和内存逻辑图类比理解,

int 类型数组 a。 首元素是a[0],包含4个元素 1 22 3 1,首地址是0,就是首元素那一串的第一个元素的地址0.

时间: 2024-10-08 10:14:03

内存编址、寻址、内存对齐的相关文章

计算机基本原理之内存编址

内存编址目的 存储器由一块块的空间(存储单元)组成,为了方便寻找到每一块空间,我们需要对每一个空间进行标识--内存编址. 内存编址概述 芯片 存储器由若干个芯片构成. 内存容量 存储器的大小.内存容量=每个芯片容量*芯片个数. 每个芯片的容量=一个地址代表的容量*编址总数. 数据总线 计算机一次处理n位的数据,则数据总线的长度为n.注意的是:数据总线的长度,并不一定代表一个地址的长度. 字 和数据总线紧密相关.数据总线有几位,则一个字就由多少位组成.如64位计算机,表示一次可以处理64位数据,则

c/c++深入篇之内存分配与内存对齐的探讨

 不明白内存分配和指针的可以看看,其实这本是我们老师留的一个操作系统科技小论文作业,不知道写什么,干脆把以前收藏的经典C内存分配的文章整理并修改了一下.       此文章有2个用处,1:这是个小论文,格式完整,大家可以复制回去交作业:2:这是整理的经典C内存分配小教程(也加了些我自己的观点),不明白内存分配的可以看看. 还有很重要的一个问题:      这篇文章引用的很多内容我也不知道究竟是出自谁手,知道作者是谁的麻烦告诉下,我好谢谢他.(记得都是csdn里面找的) tag: 操作系统 论

TLB与内存寻址,内存读取,虚拟内存的相关原理

TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存. TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块.如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据. 关于TLB与cache-CPU缓存的关系,TLB介于CPU与cache之间,是内存的管理单元,用于程序从逻辑地址访问实际内存地址的页表缓存. 当程序或cp

关于内存地址和内存空间的理解。

1.内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地址代表一个字节(8bit)的存储空间. 例如经常说32位的操作系统最多支持4GB的内存空间,也就是

内存地址和内存空间

转自:http://www.cnblogs.com/VIPler/p/4282584.html 1. 内存地址用4位16进制和8位16进制表示的区别.例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001.都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢? 首先,必须要知道内存地址只是一个编号,代表一个内存空间.那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的.也就是说一个内存地

2.1 自动内存管理机制--Java内存区域与内存溢出异常

自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存包括以下几个运行时数据区域[虚拟机内存模型]: 1.程序计数器: 可以看作是当前线程所执行的字节码的行号指示器.在虚拟机中,字节码解释器工作时就是通过程序计数器的值来选择下一条需要执行的字节码指令.Java虚拟机中多线程是通过线程轮流切换并分配处理机执行时间的方式实现的,在任何一个确定的时刻,一个处

CUDA学习日志:常量内存和纹理内存

接触CUDA的时间并不长,最开始是在cuda-convnet的代码中接触CUDA代码,当时确实看的比较痛苦.最近得空,在图书馆借了本<GPU高性能编程 CUDA实战>来看看,同时也整理一些博客来加强学习效果. Jeremy Lin 在上一篇博文中,我们谈到了如何利用共享内存来实现线程协作的问题.本篇博文我们主要来谈谈如何利用常量内存和纹理内存来提高程序性能. 常量内存 所谓的常量内存,从它的名字我们就可以知道,它是用来保存在核函数执行期间不会发生变化的数据.NVIDIA硬件提供了64KB的常量

高端内存与低端内存漫谈

[Linux 内核知识点讨论区.内存管理.  ] 低端内存与高端内存,在32位CPU中才会出现的概念,这是因为32位系统中,内核的地址空间是3G-4G(也可以配置成2G-4G,但不耽误理解高端内存与低端内存的概念).3G-4G,整个内核的虚拟地址空间就1G.1G的虚拟地址,怎么能够管理到实际2G.3G甚至是4G的物理地址呢?自然就想到了一种方法叫:从一一映射中拿出一部分的地址空间作动态的映射. 首先我们必须有常识:一一映射是天生的,是土著!所有的事物都有其发展史,很早以前没有虚拟地址物理地址的区

深入理解java虚拟机系列(一):java内存区域与内存溢出异常

文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了开始.如果有什么错误或者遗漏,欢迎指出. 一.概述 先上一张图 这张图主要列出了Java虚拟机管理的内存的几个区域. 常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java内存区域的划分实际上远比这复杂,从上图就可以看出了.堆栈分法中所指的"栈"实际上只是虚拟机栈,或者说是虚拟机栈中的局部变量表部分.接下