返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 CC++内存对齐详解
 内存对齐详解
 内存对齐是什么?为什么要对…
 提升工作便利性神器有了它们…
 TECNO携旗舰款MEGABOOK S1笔…
 你的电脑电源该换了?看看新…
 内置14CM大尺寸双滚珠轴承风…
 电源坏了换电源风扇坏了换风…
 科技大事件:富士康在印度投…
 中端的首选!华硕P8Z77-V LX…
 京东综合排名第一MSI微星H11…
 电脑换主板用重装系统吗?笔…
 从ATX到ITX锐龙7000系电脑该…
 英伟达称Ampere GeForce RTX…
 NVIDIA CEO黄仁勋:RTX光线追…
 Intel将推进自家独立显卡的研…
 手机是谁发明的 手机的发明者…
 飞机是谁发明的 世界上第一架…
 暴利时代 笔记本电源适配器购…
 广达电脑推出电源适配器Wind…
 Finsix推新版笔记本电源适配…
 群光电子代工案例汇总获多家…
 华硕在海外推出 ROG 100W Ty…
 Backblaze:到 2025 年 HDD …
 查看电脑的固态硬盘和机械硬…
 头部吃播IP浪胃仙创始人涉嫌…
 桌面mini主机好用吗?小米让…
 双硬盘的好处很多人可能还不…
 显卡价格调节器:AMD Radeon…
 多名球星加入 华硕吹雪主板双…
 高性能显卡华硕1080 长沙促销…
 高效生产力轻薄本首选华硕无…
 华硕重炮手主板双12火力全开…
 智慧导购大赛启动会 CCFA 武…
 传统行业也能“新零售”?独…
 茅台酒11个月销售破千亿背后…
 五芳斋市值暴跌下苦寻“第二…
 【高新产业链观察】2022年10…
 “黑科技工场”再创新 —— …
 爆料!七喜电脑将推出27寸高…
 Win10电脑英伟达怎么设置双屏…
 第十一课 电脑常用显示设置
 新三板创新层公司玮硕恒基新…
 【覟】的英语怎么说【覟】的…
 好内功加屠龙刀:解析联想Th…
 电脑的内存越大越好吗?如果…
 【手慢无】装机首选!199元抢…
 电脑开机显示蓝屏英文
 笔记本cpu性能排行小编教你笔…
 笔记本cpu怎么排名 笔记本cp…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
CC++内存对齐详解
作者:佚名 文章来源:本站原创 点击数: 更新时间:2022/12/15 12:29:27 | 【字体:

  单反拍电影还是用一个例子带出这个问题,看下面的小程序,理论上,32位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。

  现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但是实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

  尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度.

  现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能从地址为4的倍数的内存开始读取数据。

  假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作.

  现在有了内存对齐的,int类型数据只能存放在按照对齐规则的内存中,比如说0地址开始的内存。那么现在该处理器在取数据时一次性就能将数据读出来了,而且不需要做额外的操作,提高了效率。

  每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。

  有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位。

  (1) 结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。

  (3)结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

  以上测试都是在Linux环境下进行的,linux下默认#pragma pack(4),且结构体中最长的数据类型为4个字节,所以有效对齐单位为4字节,下面根据上面所说的规则以s2来分析其内存布局:

  sizeof(i) = 4 = 4(有效对齐位),相对于结构体首地址的偏移要为4的倍数,占用第4,5,6,7单元;

  sizeof(c2) = 1 = 4(有效对齐位),相对于结构体首地址的偏移要为1的倍数,占用第8单元;

  s2中变量i占用内存最大占4字节,而有效对齐单位也为4字节,两者较小值就是4字节。因此整体也是按照4字节对齐。由规则1得到s2占9个字节,此处再按照规则2进行整体的4字节对齐,所以整个结构体占用12个字节。

  例如,对于上个例子的三个结构体,如果前面加上#pragma pack(1),那么此时有效对齐值为1字节,此时根据对齐规则,不难看出成员是连续存放的,三个结构体的大小都是6字节。

  如果前面加上#pragma pack(2),有效对齐值为2字节,此时根据对齐规则,三个结构体的大小应为6,8,6。内存分布图如下:

  经过上面的实例分析,大家应该对内存对齐有了全面的认识和了解,在以后的编码中定义结构体时需要考虑成员变量定义的先后顺序了。

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 CC++内存对齐详解 (12-15)
    普通电脑内存 内存对齐详解 (12-15)
    普通电脑内存 内存对齐是什么?为什么要对齐?怎么? (12-15)
    普通电脑内存 【覟】的英语怎么说【覟】的英文翻译 (12-15)
    普通电脑内存 好内功加屠龙刀:解析联想ThinkStation P520c… (12-15)
    普通电脑内存 电脑的内存越大越好吗?如果只加大内存电脑反… (12-15)
    普通电脑内存 【手慢无】装机首选!199元抢购16GB DDR4 320… (12-15)
    普通电脑内存 电脑开机显示蓝屏英文 (12-15)
    普通电脑内存 电脑物理内存很大有没有设置虚拟内存的需要 (12-14)
    普通电脑内存 目前虚拟货币的英文缩写_求各种数字货币的简称… (12-14)
    普通电脑内存 什么是虚拟内存 虚拟内存有什么用【图解】 (12-14)
    普通电脑内存 深度剖析虚拟内存 (12-14)
    普通电脑内存 什么是虚拟内存?虚拟内存能提升电脑速度吗?… (12-14)
    普通电脑内存 修复域控制器内存泄露问题微软为 Win7  Win81… (12-14)
    普通电脑内存 手机内存又上热搜多大内存才够用?从实用性和… (12-14)
    普通电脑内存 内存 - OFweek显示网 (12-14)
    普通电脑内存 我搞不懂为啥你们都要配32G内存? (12-14)
    普通电脑内存 十铨为 AMD 平台推出新款 DDR5 内存支持 EXPO… (12-14)
    普通电脑内存 电脑内存和硬盘大小是什么意思? (12-14)
    普通电脑内存 搭载锐龙6900HX32GB内存高性能迷你电脑主机:… (12-14)