开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2327|回复: 4
收起左侧

[易源码分享] 自定义数据类型数据存储时的对齐

[复制链接]

结帖率:100% (1/1)
发表于 2017-12-29 12:39:51 | 显示全部楼层 |阅读模式   广东省揭阳市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
一.背景故事:
易语言本身是不支持直接进行内存的指针操作的,但是在易语言的程序开发过程中,很可能会用到和内存相关的内容,这时候我们就会使用一些额外的办法(API,第三方库,等)方法来进行内存方面的操作。但由于内存是系统敏感的东西,内存中的数据都是有保护的,如果我们不慎读取了不可操作的内存,就会导致程序的崩溃,c00000005,这样就是操作了不可用的内存。
那么操作内存,经常用的是将一个内存的地址转换为一个结构体,这样我们才能直接对数据进行操作,那么在转换的时候,我们需要得到内存指针处数据的长度,这个长度非常的关键,如果长度过短,导致数据无法完全读取,还有可能导致读取类型不对或者崩溃;另外,如果我们给的长度过长,就会导致程序读取到其他的地方的内存,引发崩溃。
二.内存对齐:
首先我们需要了解什么是内存对齐?
百度引用:
大部分的参考资料都是如是说的:
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
上面是百度百科给出的说明,实际上就是让系统调用的时候能够更快的定位到内存,然后读取内容。
三.内存对齐方法:
由于易语言使用的是默认的C编译器 进行编译连接,所以我们忽略其他的方法,包括#pragma pack”。
1. 【整数倍】数据类型中的第一个成员放在一个偏移为0的位置,以后每个成员的起始位置都是从该自定义数据类型中每一个成员的整数倍开始。
2. 【倍数】通过计算,我们得到了数据类型的长度。必须是其内部最大成员长度的整数倍.不足的要补齐,具体看例子。
例子:
图片1.png
因为28 除以8不能整除,所以必须要补位。这个补的操作由系统内部进行。
最终的长度为32。这样这个就已经字节对齐了。
如果上面这个不明显,我们来看看下面这个C语言版更加直观:
图片2.png
短整数长度:2double长度:8,那么对齐的结果就应该是:
16


本帖被以下淘专辑推荐:

结帖率:50% (1/2)
发表于 2018-1-1 22:33:44 | 显示全部楼层   柬埔寨
支持~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2017-12-30 15:53:39 | 显示全部楼层   云南省楚雄彝族自治州
大神说什么我都觉得很有道理
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 11 天

发表于 2017-12-29 15:21:39 | 显示全部楼层   河北省石家庄市
支持一下顶楼主
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 26 天

发表于 2017-12-29 12:43:23 | 显示全部楼层   陕西省安康市
大神发帖了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表