GNU C - 关于8086的内存访问机制以及内存对齐(memory alignment)
一、为什么需要内存对齐?
无论做什么事情,我都习惯性的问自己:为什么我要去做这件事情? 是啊,这可能也是个大家都会去想的问题,
因为我们都不能稀里糊涂的或者。那为什么需要内存对齐呢?这要从cpu的内存访问机制说起.
为了了解清楚cpu的内存访问机制,昨天整晚都在查找资料,但是还是找不到很好的介绍资料.后来只是找到了相关
的一些介绍的博客。 这些博客中大多都是以介绍内存对齐为主要目的,然后顺带着说一下cpu的内存访问机制,所以
找不到权威的资料,后来听说<<汇编语言编程艺术>>这本书里面有关于x86的系统介绍,就下载了一份PDF,但是
也还是没有找到.
所以呢下面的一些关于x86的内存访问方面的只是很多都是来源于一些比较好的博客.在文章的最后我会注明参考的
博客链接,作为扩展阅读.
简单介绍x86的内存访问机制:
1.内存的写入操作: cpu把需要写入的地址放入地址总线, 把需要写入的数据放入数据总线, 把控制总线置为写入操作.
然后内存子系统根据地址总线选定内存单元, 检查控制总线发现是写入操作,则入去数据总线数据, 写入相关内存
单元.
2.内存的读入操作: cpu把需要读入的地址放入地址总线, 把控制总线置为读入操作. 内存子系统根据地址总线选定内存
单元, 检查控制总线发现是读入操作, 则读取内存单元中的数据, 写入数据总线.
16bit数据总线: 每个内存周期,cpu只能读取一个偶单元和一个奇单元,地址总线的地址是偶单元的地址,所以地址总线的地址永远是2对齐的.
每个内存周期,可以读取一个字,也就是16bit.
1.读取一个字,如果是以2对齐的,则只需要一个内存周期即可完成.如果数据不是以2对齐的,则需要2个内存周期.
2.读取双字: 如果是以2对齐的,则只需要2个内存周期即可完成,如果数据不是以2对齐的,则需要3个内存周期完成.
32bit数据总线: 每个内存周期,读取的数据地址都是以4对齐的.一个内存周期可以读取一个双字,也就是32bit.
1.如果读取一个双字,地址是以4对齐的话,则只需要一个内存周期即可完成.如果不是以4对齐,则需要2个内存周期完成.
2.如果读取一个字,地址是对4取模余3的话,那么需要2个内存周期完成对数据的读取.地址如果对4去模不余3的话,则
只需要一个内存周期即可完成数据读取.
3. 对于字节, 任何字节地址读取只需要一个内存周期.
通过上面可以看得出,为什么16bit数据总线cpu是以2对齐的,而32bit数据总线cpu是以4对齐的. 最主要的原因是能够在最小的
内存周期内完成对地址的访问,提高cpu的效率.
二、内存对齐的作用
如果不采用内存对齐机制的话,有些地址的访问需要在多个内存周期内完成,而且还需要多次内存周期读取的高低字节
进行拼凑,然后得到32bit数据. 如果使用内存对齐机制,不仅可以减少对地址访问过程中需要的内存周期,而且还避免了
高低字节的数据拼凑,提高了cpu的工作效率.
三、编译器是如何处理内存对齐的??
struct
mem_alignment
{
char
a;
int
b;
char
c;
};
在32位x86机器上面它的大小是12. 另外一个问题,如果结构体中的成员变量顺序不一样会导致该结构在内存中的长度
也不一样,就像上面,如果改成下面这个样子:
struct
mem_alignment
{
char
a;
char
c;
int
b;
};
那么它的大小就变成了8.
如果我们使用紧凑的对齐方式 __attribute__((packed)) or __attribute__((aligned (1)))的话,
那么struct mem_alignment的大小应该是6. 或者是使用伪指令#pragma pack (1).
#pragma pack (1)
struct
mem_alignment
{
char
a;
char
c;
int
b;
};
#pragma pack ()
上面最后一句的作用是恢复编译器默认的对齐方式.
关于内存对齐方面的知识就总结到这里. 也算是对前面文章的交代了~
GNU C - 关于8086的内存访问机制以及内存对齐(memory alignment)的更多相关文章
- Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制
Linux中的Buffer Cache和Page Cache echo 3 > /proc/sys/vm/drop_caches Slab内存管理机制 SLUB内存管理机制 http://w ...
- numactl 修改 非统一内存访问架构 NUMA(Non Uniform Memory Access Architecture)模式
当今数据计算领域的主要应用程序和模型可大致分为三大类: (1)联机事务处理(OLTP). (2)决策支持系统(DSS) (3)企业信息通讯(BusinessCommunications) 上述三类系统 ...
- JVM自动内存管理机制——Java内存区域(下)
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...
- JVM自动内存管理机制——Java内存区域(上)
一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...
- 2.1 自动内存管理机制--Java内存区域与内存溢出异常
自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...
- Android内存管理机制之一:low memory killer
转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...
- JVM内存回收机制——哪些内存需要被回收(JVM学习系列2)
上一篇文章中讨论了Java内存运行时的各个区域,其中程序计数器.虚拟机栈.本地方法栈随线程生灭,且创建时需要多少内存,基本上在译期间就决定的了,所以在内存回收时无需特殊的关注.而堆和方法区则不同,首先 ...
- Java的内存管理机制之内存区域划分
各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...
- 分布式缓存系统 Memcached 内存管理机制
在前面slab数据存储部分分析了Memecached中记录数据的具体存储机制,从中可以看到所采用的内存管理机制——slab内存管理,这也正是linux所采用的内存高效管理机制,对于Memchached ...
随机推荐
- eclipse编辑工具小结
eclipse编辑工具小结 这两天从myeclipse转入eclipse,整体感觉不错,速度更快些,也没在出现各种意外的调试错误.不能断点等情况,并且对整个编辑环境的使用有了更深入的认识,再次对主要几 ...
- 【剑指offer】面试题34:丑数
题目: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路: 第一 ...
- Find the Celebrity 解答
Question Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there ma ...
- C 本地文件夸网文件Cp操作
1,linux平台C简单实现本地文件cp 码子及运行效果测试
- Codeforces Round #389(div 2)
A =w= B QvQ C 题意:在一个格子图里给出一个路径 里面有UDLR四种移动方向 问 我在格子路径里面最少选几个点 可以让我沿着格子路径走 其实是在相邻的点与点之间走最短路 分析:贪心+模拟 ...
- [bzoj1003][ZJOI2006][物流运输] (最短路+dp)
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- Jquery面试题整合
来自棱镜学院-在线IT教育 www.prismcollege.com 一.Jquery測试题 以下哪种不是jquery的选择器?(单选) A.基本选择器 B.后代选择器 C.类选择器 D.进一 ...
- CI框架源代码阅读笔记3 全局函数Common.php
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...
- Node.JS + MongoDB技术浅谈
看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座 云计算 +大数据 ...
- javascript运动功能-分享到
<script> //窗体载入,为div控件绑定事件 window.onload = function () { var div1 = document.getElementById('d ...