什么是字节对齐,为什么要对齐

什么是字节对齐,为什么要对齐,第1张

对齐方式对齐方式是段落内容在文档的左右边界之间的横向排列方式。Word共有5种对齐方式:左对齐、右对齐、居中对齐、两端对齐和分散对齐。 左对齐是将文字段落的左边边缘对齐; 两端对齐是将文字段落的左右两端的边缘都对齐; 两者异同: 这两种对齐方式的左边都是对齐的,而一般来说,如果段末最后一行字数太少,那么最后一行“两端对齐”的效果与“左对齐”的效果一样;又由于我们的阅读习惯基本上都是从左到右,且中文文章中的行尾相差不,不注意看不出其中差别,因此,人们就会觉得“左对齐”与“两端对齐”的效果一样。 其实呢,两者之间是有区别的,“两端对齐”的段落的右边也是对齐的,而“左对齐”的右边一般情况下不会对齐。做个试验:你在word中输入一段比较长的英文文字,分别使用两种不同的对齐方式,仔细观察,就会发现两者之间的差别了。 因为一般来说,我们有这样的书写规则:大部分标点符号不能放在行首,比如句号“。”、问号“?”等; 一串字符(一个英文单词、一串数字)不能拆开或割断放在不同的两行; 于是,在这样的书写规则下,我们常常会遇到文章各行的文字(字符)数不相等的情况,这时采用“左对齐”的方式,就会出现每行行尾不整齐的情况,而采用“两端对齐”的方式,就会把超出的行压缩、减少的行拉伸,使整个段落各行右端也对齐(末行除外),这样的文章看上去就比较美观些。 在两端对齐方式中,由于通常每段最后一行都比其他行短,文本会显得没有两端对齐。要使具有两端对齐格式的段落中的最后一行也两端对齐,请将插入点置于最后一行末尾,然后按 Shift+Enter。请注意,如果对齐的行很短,会在单词间插入大段的空白,因而会使该行显得不美观。

[TOC]

现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐.

为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位)。字节对齐有什么好处?以int型数据为例,如果它在内存中存放的位置按4字节对齐,也就是说1个int的数据全部落在计算机一次取数的区间内,那么只需要取一次就可以了.

通常,我们写程序的时候,不需要考虑对齐问题,编译器会替我们选择适合目标平台的对齐策略。但是,正因为我们一般不需要关心这个问题,所以,如果编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,例如:

//下面我们更换一下成员变量位置,看看有什么效果

那么问题来了,两个结构体的成员变量只是改变了下顺序,为什么占用的内存大小不同呢?

对齐原则:

根据以上原则,我们来分析:

下面分析:

例如:

pragma pack 的用法

attribute ((packed))的用法:

让指定的结构结构体按照 1 字节对齐,例如:

可以看出,默认系统是按照4字节对齐

用packed修饰后,变为1字节对齐,这个常用于与协议有关的网络传输中.

答案是:12

答案是:8

也就是说:两个结构体,仅仅是里面包含的数据类型的位置变了,它的大小就会不一样!

这就是内存对齐的问题,也是编译器帮我们把每一个数据单元安排在了合适的位置。

好吧,内存对齐规则说的太专业,其实说白了就是,在没有 #pragma pack(n) 下,默认都是4字节对齐。

对于st1,char是1字节,相邻的int是4字节,因此1+4>4了,所以char只能单独享用4字节了,同理short也是一样,因此就是4+4+4=12字节。

对于st2,char是1字节,相邻的short是2字节,因此1+2<4,所以char和short可以一起享用4字节了,而int在享用4字节,因此就是4+4=8字节。

晦涩的专业语言把道理精简再精炼,而白话文却能把道理婵婵道来,不得不说,语言的神奇。

出差必备:

买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP, 点击注册

优惠购物:

你还在傻傻的原价淘宝吗?来这里领取内部优惠券,折扣力度非常大! 点击注册 ,注册需要邀请码UWD9Q9E。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6720002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存