01、初学者对于结构体内存对齐与补齐的理解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

而且,double b之前空着的内存,在对齐下原则可以随意增加变量,内存是不会增加的。如下图:
3、内存的补齐原则: 当定义结构体为:
struct number_4 {
char a; int b; char c; }st4;
时发现sizeof(st4)=12,而不是4+4+1=9。 这时候就牵扯到一个补齐原则: 在经过对齐原则分析后,检查计算出的存储单元是否为所有元素中所占内存最大的元素的长度的整 数倍,是,则结束;若不是,则补齐为它的整数倍。 即,当4+4+1=9不是结构体中内存最大元素b的整数倍时,要补齐成其整数倍12。如下图左所示,如
});
struct number_2 {
char a; int b; double c; }st2;
st2所占内存并非1+4+8=13个,而是16个>13个。这是为什么? 我们会发现,sizeof(st2)=16,刚好是double类型的二倍,这又是为什么? 我们将上例改为:
struct number_3 {
char a; int b; }st3;
会发现st3内存占用并非1+4=5个,而是sizeof(st3)=8个,刚好是int类型的二倍,这又是为什么?? 了解过结构体内存对齐原则以后,初学时的问题才得以解决。 2、结构体在内存中的对齐原则: 结构体中包含有相同类型或不同类型的数据类型,如char(1字节),int(4字节),double(8字节 ),所以结构体内存出现了一个对齐原则: 结构体变量中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储 的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元 素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。 即,当char a时,以char自身大小(一字节)划分,a占有了首地址0一个字节。但是当int b时,以 int自身大小(四字节)划分,所以b从四字节的ቤተ መጻሕፍቲ ባይዱ负整数倍开始存储占用四个字节,由于首地址0已 被占用,所以b从第四个地址开始占用四个字节。同理,当double c时,double也以自身大小(八字节 )划分内存,而前八个(0——7)已被占用,故c从第八个地址开始占用八个字节。如下左图: 如果去掉中间定义的int b,st2仍然占16个字节。因为,double c时,首地址0已被占用,c不能从 0(8的0倍)开始,就只能从8(8的1倍)开始。如下右图:
果将int换成double,sizeof(st4)=24为最大元素double的整数倍了。如下图右所示:
总结: 结构体在内存中的存储遵循着对齐与补齐的原则来存储。
$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('').text(i)); }; $numbering.fadeIn(1700); });
1. 初学者对于结构体内存对齐与补齐的理解
1、问题提出: 刚开始学习结构体的时候,我们通常认为结构体
struct number_1 {
int a; int b; int c; }st1;
占用空间为sizeof(st1.a)+sizeof(st1.b)+sizeof(st1.c)个, (在vc++6.0中为4+4+4=12个)(为方便下文均以vc++6.0编译环境为例),实际操作中也是如此。道理 却不是4+4+4=12的道理。 如:
相关文档
最新文档