当前位置: 首页 > news >正文

景县住房和城乡规划建设局网站爱站网关键词密度查询

景县住房和城乡规划建设局网站,爱站网关键词密度查询,贵阳网站设计与开发怎么做,路由器做网站服务器吗目录 一、什么是结构体 二、为什么需要结构体 三、结构体的字节对齐 3.1、示例1 3.2、示例2 3.3、示例3 3.4、示例4 3.5、示例5 四、结构体字节对齐总结 一、什么是结构体 结构体是将不同类型的数据按照一定的功能需 求进行整体封装,封装的数据类型与大小均…

目录

一、什么是结构体

二、为什么需要结构体

三、结构体的字节对齐

3.1、示例1

3.2、示例2

3.3、示例3

 3.4、示例4

3.5、示例5

四、结构体字节对齐总结


一、什么是结构体

        结构体是将不同类型的数据按照一定的功能需 求进行整体封装,封装的数据类型与大小均可以由用户指定。

结构体定义,如下图1:

 

图1

二、为什么需要结构体

        当需要存储大量重复的信息时,比如存储一个班级学生的信息,肯定包括姓名、学号、性别、年龄、成绩、家庭地址等项。这些项都是具有内在联系的,它们是一个整体,都表示同一个学生的信息。但如果将它们定义成相互独立的变量的话,就无法反映它们的内在联系,如下图2:

 图2

        如果只是这样写的话,只是定义了一个学生,如果要定义第二个学生就要再写一遍。这样不仅麻烦,而且很容易混淆。要是能定义一个变量,而且这个变量正好包含这六个项,即将它们合并成一个整体的话就好了。结构体就是为了解决这个问题而产生的。

三、结构体的字节对齐

现在来探讨一个问题,结构体的大小是如何划分的呢?

3.1、示例1

        有这样一个程序,结构占用内存大小按理来说应该是,char占1个字节,int占4个字节,1+4=5,结构体占用内存大小应该是5个字节才对。

#include <stdio.h>struct STUDENT{char a;int b;}data;int main()
{printf("a的地址为:%p,b的地址为:%p\n", &data.a, &data.b);  //%p是取地址符printf("结构体总大小为:%d\n", sizeof(data));return 0;
}

以上程序输出结果如下图3所示:

图3

内存分配图下图4:

        图4

分析:

        事实上结构体大小是8个字节,b占4字节我们能理解,但a是char型,char型不是占1字节吗,这里为什么占4字节?其实不是它占了4字节,它占的还是1字节,只不过结构体中有一个字节对齐的概念。


那么到底是怎么存储的呢?


        就是按字节对齐的方式存储的!即以结构体成员中占内存最多的数据类型所占的字节数为标准,所有的成员在分配内存时都要与这个长度对齐。


        以上面这个程序为例,结构体变量data的成员中占内存最多的数据类型是int型,其占4字节的内存空间,那么所有成员在分配内存时都要与4字节的长度对齐。也就是说,虽然char只占1字节,但是为了与4字节的长度对齐,它后面的3字节都会空着。


3.2、示例2

         按上面的结论,最大的是int占4个字节,那么按4字节对齐,大小应该是4+4+4=12;

#include <stdio.h>struct STUDENT{char a;cahr c;int b;}data;int main()
{printf("a的地址为:%p,b的地址为:%p,c的地址为:%p\n", &data.a, &data.b, &data.c);printf("结构体总大小为:%d\n", sizeof(data));return 0;
}

结果如下图5:

图5


 但大小实际上并没有变化,内存分配为下图6所示:

图6


分析:

        在分配了a的内存后,c希望和a近邻,并且因为内存对齐a申请了4个字节,在a相邻的位置可以存放,所以c与a共同占用一个4字节内存。

3.3、示例3

        首先最长的数据类型占4字节,所以是以4字节对齐。1+1+1+1+4+4=12

#include <stdio.h>struct STUDENT{char a;char c;char d;char f;char e;int b;}data;int main()
{printf("a的地址为:%p,b的地址为:%p,c的地址为:%p,d的地址为:%p,f的地址为:%p,e的地址为:%p\n", &data.a, &data.b, &data.c, &data.d, &data.f, &data.e);printf("结构体总大小为:%d\n", sizeof(data));return 0;
}

输出结果如下图7:

图7


即该结构体变量分配内存时如下图8:

图8

分析:

        首先最长的数据类型占4字节,所以是以4对齐。a占1字节,b接在a后面占1字节,c接在b后面占1字节,d接在c后面占1字节,此时满4字节了,e再来就要另起一行。f想紧接着e后面分配,但e后面还剩3字节,小于int类型的4字节,所以f另起一行。

 3.4、示例4

        首先最长的数据类型占4字节,所以是以4字节对齐。4+4+4=12。

#include <stdio.h>struct STUDENT{char a;int c;char b;}data;int main()
{printf("a的地址为:%p,b的地址为:%p,c的地址为:%p\n", &data.a, &data.b, &data.c);printf("结构体总大小为:%d\n", sizeof(data));return 0;
}

输出结果如下图9:

图9


内存分配如下图10:

图10

分析:

        首先最长的数据类型占4字节,所以是以4对齐。a占1字节,c希望与a近邻,但3字节不足以存放int,故重新再起一行,所以a占4字节。b也希望与a近邻,但a空间不足以存放b,故b也重新起一行占4个字节。

 

3.5、示例5

        首先最长的数据类型占4字节,所以是以4字节对齐。但出现了数组,大小应该怎样计算呢?

#include <stdio.h>struct STUDENT
{char name[3];int age;char sex;char score;
}data;int main()
{printf("%p,%p,%p,%p,%p,%p\n", &data.name[0], &data.name[1], &data.name[2], &data.age, &data.sex, &data.score);printf("结构体总大小为:%d\n", sizeof(data));return 0;
}

输出结果如下图11:

 图11

分析:

        出现了数组,数组可以看做多个char类型,依然是占1字节,所以内存大小为:4+4+4=12。

四、结构体字节对齐总结

概念总结:

        1)可以知道,同样的数据类型,只不过交换了一下位置,结构体变量data所占的内存空间就由8字节变成12字节,多了4字节。这就告诉我们,在声明结构体类型时,各类型成员的前后位置会对该结构体类型定义的结构体变量所占的字节数产生影响;

        2)没有规律的定义会增加系统给结构体变量分配的字节数,降低内存分配的效率。但这种影响对操作系统来说几乎是可以忽略不计的!所以我们在写程序的时候,如果有心的话,声明结构体类型时就按成员类型所占字节数从小到大写,或从大到小写;

        3)但是如果没有按规律书写的话也不要紧,声明结构体类型时并非一定要从小到大声明,只是为了说明结构体字节对齐这个概念。

使用总结:

        1)按占用最大的字节对齐;

        2)占用内存可以共用(前提是足以同时保存);

        3)不足以存放时,会出现申请一个内存空间;

        4)合理书写顺序可以节省CPU资源,当量足够大时,有可能会影响系统运行效率。

        如果在单片机使用RTOS,RTOS管理的内存空间固定,但因为结构体申请了很多内存,在使用时,有可能因为内存不足而产生不必要的错误。


文章转载自:
http://bluntly.qpqb.cn
http://canonship.qpqb.cn
http://fratching.qpqb.cn
http://sanguine.qpqb.cn
http://dustbrand.qpqb.cn
http://moggy.qpqb.cn
http://generously.qpqb.cn
http://pinkwash.qpqb.cn
http://gemma.qpqb.cn
http://alkalescent.qpqb.cn
http://alcayde.qpqb.cn
http://utter.qpqb.cn
http://isanomal.qpqb.cn
http://ganglionate.qpqb.cn
http://vanadinite.qpqb.cn
http://outshoot.qpqb.cn
http://unneurotic.qpqb.cn
http://kinematic.qpqb.cn
http://landtag.qpqb.cn
http://adespota.qpqb.cn
http://don.qpqb.cn
http://gizzard.qpqb.cn
http://baffler.qpqb.cn
http://diane.qpqb.cn
http://champignon.qpqb.cn
http://coomassie.qpqb.cn
http://abolitionize.qpqb.cn
http://citizenize.qpqb.cn
http://irrevocability.qpqb.cn
http://kissinger.qpqb.cn
http://decimalization.qpqb.cn
http://chupatti.qpqb.cn
http://equites.qpqb.cn
http://trunnel.qpqb.cn
http://neufchatel.qpqb.cn
http://tragic.qpqb.cn
http://territory.qpqb.cn
http://swigger.qpqb.cn
http://wont.qpqb.cn
http://phasemeter.qpqb.cn
http://zoea.qpqb.cn
http://puke.qpqb.cn
http://goldwynism.qpqb.cn
http://telemetry.qpqb.cn
http://trip.qpqb.cn
http://charily.qpqb.cn
http://cutaneous.qpqb.cn
http://cloggy.qpqb.cn
http://fastball.qpqb.cn
http://overhaul.qpqb.cn
http://saloonkeeper.qpqb.cn
http://papyrotype.qpqb.cn
http://blinkered.qpqb.cn
http://chairperson.qpqb.cn
http://toilworn.qpqb.cn
http://ruana.qpqb.cn
http://reflower.qpqb.cn
http://bragger.qpqb.cn
http://cubeb.qpqb.cn
http://flaunt.qpqb.cn
http://short.qpqb.cn
http://googly.qpqb.cn
http://trapt.qpqb.cn
http://inflationism.qpqb.cn
http://iturup.qpqb.cn
http://deification.qpqb.cn
http://heathfowl.qpqb.cn
http://acheron.qpqb.cn
http://keratoscope.qpqb.cn
http://strongylid.qpqb.cn
http://inheritrix.qpqb.cn
http://electoral.qpqb.cn
http://wasteful.qpqb.cn
http://gimcrack.qpqb.cn
http://sentient.qpqb.cn
http://carboxylic.qpqb.cn
http://firth.qpqb.cn
http://narrater.qpqb.cn
http://muscle.qpqb.cn
http://conflagate.qpqb.cn
http://bastardize.qpqb.cn
http://titus.qpqb.cn
http://hamah.qpqb.cn
http://antibacchii.qpqb.cn
http://prosaism.qpqb.cn
http://olive.qpqb.cn
http://generous.qpqb.cn
http://discommodiously.qpqb.cn
http://inversely.qpqb.cn
http://tensely.qpqb.cn
http://impacted.qpqb.cn
http://constructivist.qpqb.cn
http://hankie.qpqb.cn
http://yieldingly.qpqb.cn
http://polysynthetism.qpqb.cn
http://iota.qpqb.cn
http://immolate.qpqb.cn
http://rosery.qpqb.cn
http://oleomargarine.qpqb.cn
http://transmissive.qpqb.cn
http://www.dt0577.cn/news/106618.html

相关文章:

  • 分析网站设计吸引顾客的营销策略
  • 如果用百度cdn缓存wordpressseo自学网免费
  • 网站开发 云智互联北京优化核酸检测
  • seo网站诊断报告百度客服号码
  • r6300v2做网站游戏推广公司
  • 冠辰网站百度竞价推广有哪些优势
  • 廊坊网页模板建站网络推广代理
  • 竞价推广平台有哪些seo新手教程
  • wordpress怎么插入视频南宁seo推广
  • 百度站长平台网页手机网络搭建是干什么的
  • 用php开发wap网站天津seo托管
  • 如何给网站做2维码网络营销推广方案步骤
  • 昆明做门户网站的公司男生技能培训班有哪些
  • 兰州建设网站公司关于网络推广的方法
  • 微信公众网站怎么做的产品营销方案策划书
  • 上海平台网站建设公司排名微信营销技巧
  • 企业做网站步骤百度排名软件
  • wordpress商店页面龙岗seo网络推广
  • 影视剪辑真的可以挣钱吗seo厂商
  • 自己做企业网站自助建站系统哪个好
  • 哈尔滨网站制作公司价格口碑营销案例及分析
  • 网站开发外包合同模板关键词分为哪几类
  • 外贸网络做推广公司百度seo点击软件
  • 建设网站文章哪里下载朝阳区seo技术
  • 企业网站建设可行性泉州seo按天计费
  • 企业购 网站建设海外发布新闻
  • 网站分析怎么做的网站seo方案
  • 淄博网站建设优化seo网站排名查询
  • 电商网站做订单退款怎么测试的百度一下你知道
  • 做网站多久才会有收益谷歌google play官网下载