免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3433 | 回复: 15
打印 上一主题 下一主题

关于结构类型对齐的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-23 16:08 |只看该作者 |倒序浏览
我们都知道,为了提高访问效率,数据结构都需要对齐,并且还有一套对齐的公式。那么问题来了,为什么只是数据结构需要
对齐,而那些保留字类型的(char,short,int,double)等却不需要对齐?
此外,我们知道,程度编译后会分成代码段和数据段,代码段中的代码和数据一样,都需要CPU从内存中读取,所以一样涉及到读取效率问题,所以问题又
来了,代码段的指令难道也是对齐的吗,如果不是,那为什么不像结构一样对齐哪?
以上问题困惑了我好久好久,一直无法解决,还有就是那个结构的对齐公式是如何推导出来的?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-02-23 16:14 |只看该作者
单个变量也是对齐的。其实编译好之后根本就没有结构概念了

论坛徽章:
0
3 [报告]
发表于 2010-02-23 16:15 |只看该作者
{:3_185:},不太明白,同问。

论坛徽章:
0
4 [报告]
发表于 2010-02-23 16:15 |只看该作者
首先,元类型也是要对齐的,不同的架构有不同的规格。
其次,代码段不用对齐,因为机器指令都是固定长度,本身就对齐。

对齐是计算机的基本概念,和数据结构没啥关系

http://en.wikipedia.org/wiki/Data_structure_alignment

论坛徽章:
0
5 [报告]
发表于 2010-02-23 16:20 |只看该作者
回复 4# sbc19861004
”因为机器指令都是固定长度,本身就对齐。“这个确定么?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2010-02-23 16:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2010-02-23 16:52 |只看该作者
回复 5# peidright


    sorry,这个解释不太正确。对于绝大多数RISC结构,是定长的;而对于x86则中CISC架构,是非定长的,且并没有对齐,读取时是按字节读取的。
这个帖子对指令介绍的比较全面:
http://linux.chinaunix.net/bbs/archiver/tid-1050733.html

论坛徽章:
0
8 [报告]
发表于 2010-02-23 16:53 |只看该作者
首先,元类型也是要对齐的,不同的架构有不同的规格。
其次,代码段不用对齐,因为机器指令都是固定长度, ...
sbc19861004 发表于 2010-02-23 16:15



    关于机器指令的长度至少对intel指令来说,肯定不是固定的,是基于复杂指令集和精简指令集之间的一个系统,最长的指令可能15个字节,最短的可能只需1个字节。你说元类型也是对齐的,我个人也倾向这样认为,不过没有看到相关的描述,不知道楼主是从哪里看到的,同时,那些对齐公式又是怎么得来的?

论坛徽章:
0
9 [报告]
发表于 2010-02-23 16:59 |只看该作者
关于机器指令的长度至少对intel指令来说,肯定不是固定的,是基于复杂指令集和精简指令集之间的一 ...
li574000 发表于 2010-02-23 16:53


http://en.wikipedia.org/wiki/Data_structure_alignment 的Architechture一项,里面对RISC,x86, x86-64这几种计算机架构都给了各自元数据对齐方法的解释。

论坛徽章:
0
10 [报告]
发表于 2010-02-23 16:59 |只看该作者
回复  peidright


    sorry,这个解释不太正确。对于绝大多数RISC结构,是定长的;而对于x86则中CISC架 ...
sbc19861004 发表于 2010-02-23 16:52



    既然不是定长,那代码段的指令是否对齐的哪?不知道这个对齐到底最底层是和编译器有关还是和CPU有关,我想对于一个指定的CPU,每次从内存读取数据的时候,内存读取粒度应该是固定的,比如一次读取4个字节,而我们的编译器可以对粒度通过宏pragrma_pack进行设置,并且可以设置成1,2,4,8,16,那么意思是否是说CPU读取内存的粒度是可以程序改变的,还是说
只是编译器一厢情愿的按照这种粒度去填充字节,而CPU还是按照自己设计的粒度去读取?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP