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

织梦网站图片怎么修改不了关于建筑建设的网站

织梦网站图片怎么修改不了,关于建筑建设的网站,一键wordpress建站,毛戈平化妆培训学校官网目录 一、前言 二、引出 ---- 结构体内存对齐 #x1f34e;结构体偏移量计算#xff1a;offsetof #x1f95d;结构体内存对齐详解 #x1f4a6;规则介绍#xff08;重点#xff01;#xff01;#xff09; #x1f4a6;例题解析 三、习题演练 #x1f34d;练习① …目录 一、前言 二、引出 ---- 结构体内存对齐 结构体偏移量计算offsetof 结构体内存对齐详解 规则介绍重点 例题解析 三、习题演练 练习① 练习② 四、为什么存在内存对齐? 1、平台原因(移植原因) 2、性能原因  五、如何修改默认对齐数  六、实战演练 七、共勉 一、前言 结构体 大家都应该了解过可是大家是否会去深究结构体中的---结构体内存问题呢由于最近在找实习的过程中每次都会被问到结构体内存大小的问题每次都是以回答错误而结束面试。 所以现在现在才醒悟过来才知道这些知识点有多么的重要所以咬紧牙把这个内容的知识点记录下来 二、引出 ---- 结构体内存对齐 在结构体章节我们掌握了结构体的基本使用但是现在我要你去计算一个结构体的大小你会怎么做呢 现在我定义了两个结构体通过观察可以发现它们内部的成员变量都是一样的均有c1、c2、i三个成员变量那此时分别去计算它们两个结构体的大小 最后的结果会是多少呢会是一样的吗 struct S1 {char c1;int i;char c2; };struct S2 {char c1;char c2;int i; };int main(void) {printf(%d\n, sizeof(struct S1));printf(%d\n, sizeof(struct S2));return 0; }通过运行可以发现两者是不一样的这是为什么呢如果你没有结构体内存对齐的相关知识那相信你一定会这么去计算 在结构体S1中c1的类型为【char】是1个字节i的类型是【int】是4个字节c2的类型为【char】是1个字节 那么最后的结果就是1 4 1 6B可事实呢原不止这些。 大家仔细的想一下为什么会出现这样的结果呢这与结构体内存有什么关系呢下面我用结构体偏移量计算offsetof 来给大家详细的解释一下 结构体偏移量计算offsetof 就上面的内容大家会产生很大的困惑下面给大家介绍一个宏叫做offsetof它可以用来计算结构体成员相对于起始位置的偏移量 它的第一个参数是结构体类型第二个参数是结构体成员 printf(%d\n, offsetof(struct S1, c1)); printf(%d\n, offsetof(struct S1, i)); printf(%d\n, offsetof(struct S1, c2));最后计算出来的结果分别是【0】【4】【8】那我们可以通过画内存图来看看结构体中的三个成员变量在内存中究竟是如何分布的 可以看出因为总的结构体大小为12B可是在放完这3个成员后中间空出了三个位置并且对于最后在c放完之后还没有到达12B所以还得再浪费3个空间的废位置 为什么会出现上面这样的现象呢对于结构体内存对齐的规则是怎样让我们继续看下去  结构体内存对齐详解 规则介绍重点 第一个成员在与结构体变量偏移量为0的地址处其他成员变量要对齐到某个数字对齐数的整数倍的地址处对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 【VS中默认的值为8、Linux环境默认不设对齐数对齐数是结构体成员自身的大小】结构体总大小为最大对齐数每个成员变量都有一个对齐数的整数倍如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍 例题解析 知晓了上面这些规则后大部分老铁呢肯定还是会有点懵逼接下来我们通过例题来回顾上面的规则这样大家能更好的理解 ----- 结构体的大小该如何计算 假设我这里创建一个结构体变量叫做ss它的起始地址就从0开始所以根据第一条规则第一个成员变量在与结构体变量偏移量为0的地址处而且它的类型还是char所以只占1个内存单元 接下去看第二个成员变量 i其为整型所以在内存中就需要存储4个字节的大小此时便要拿其和VS下默认对齐数8去进行比较取较小的值4 算出来【4】之后便要对齐到4整数倍的地址处那就是4这块空间往下一直占用4个字节这就是成员变量i在这个结构体中的内存占用分布 那既然这个 i是从4的位置开始放的中间空出来的位置就不会再放置其他成员变量了那么这个3个空间也就浪费了 接下去放置第三个成员变量c2char类型的变量为1个字节和8比较取小就是1那就要将其放到1整数倍的地址处那其实任何空间都是可以的直接放到这个【8】的位置就行 那截止目前为止这个结构体中的所有成员变量都放置完了此时去计算一个所占的内存空间就可以发现只有9个字节。但是在一开始我们计算的这个结构体的大小为12个字节可是现在还差3个字节所以最后就要去进行一个填充。但是为什么呢 这就要用到第三条规则了结构体总大小为最大对齐数的整数倍那在这么计算下来之后就可以知道结构体中的最大对齐数为4那么【9】、【10】、【11】都不是它的整数倍只有【12】是它的整数倍的地址处注意这里是地址处因此我们需要填充3个字节此时从0 ~ 11就有12个字节了便为4的整数倍 这就是【12】如何被计算出来的全过程你听懂了吗 看完了这个结构体后还记得结构体S2吗我再来讲一道当然你也可以试着自己写写画画看 首先还是一样c1放在这个与结构体变量偏移量为0的地址处而且它的类型还是char所以只占1个内存单元 接下去还是一样在放置第二个成员变量开始就要考虑【对齐数】了char所占的字节为1B与8去进行比较一下就可以知道1来得小那我们直接放在偏移处为1的地方就可以了此时在内存中也只占了1个字节 接下去放置第三个成员变量【i】大小为4个字节小于8因此选择在4的整数倍的地址处开始放置这个变量整型占4个字节所以一直占用到偏移量为7的地方接下去就是计算整个结构体的大小最大对齐数为4所以要为4的整数倍此时去计算一下得知从0 ~ 7偏移了7个字节占用了8个空间刚好为4的整数倍所以结构体S2的大小为【8】是这么算出来的你明白了吗 三、习题演练 通过上面两道例题的讲解相信你对如何去计算结构体大小一定有了一个自己的认识接下去就让我们趁热打铁来做两道题目再练一练看看自己是否真的掌握了  练习① 你可以先试着自己做一做然后和我对一下是否正确 struct S3 {double d;char c;int i; }; printf(%d\n, sizeof(struct S3));【分析】 首先看到第一个成员变量从偏移量为0的地址处开始放起因为double类型的数据在内存中占8个字节所以一直占用偏移处为7的地方 对于第二个成员变量【c】类型为char所以在内存中占用1个字节那直接放在偏移量为8的地址处即可  接下去来安排第三个成员变量【i】整型占用4个字节比VS下默认对齐数8来得小所以【对齐数为4】去寻找4整数倍的地址处【9】、【10】、【11】都不是【12】是4的整数所偏移的地址处从此处开始往下数4个字节的空间刚好放满15 最后我们便去计算整个结构体的大小为最大对齐数的整数倍最大对齐数是8计算一下放置三个成员变量占了16个空间刚好是8的整数倍因此16即为结构体的大小 运行结果如下 练习② 接下去再来做一道练习涉及结构体嵌套的问题对应的需要使用到规则4忘记了可以翻上去看看 struct S3 {double d;char c;int i; };struct S4 {char c1;struct S3 s3; //成员变量为另一个结构体double d; };因为本题的结构体比较大所以就标出4的整数倍所在的地址 首先还是一样来看到第一个成员变量【c1】放到与结构体变量偏移量为0的地址处又因为类型为char所以只占一个字节的空间 接下去就是嵌套的结构体s3此时我们要对齐到s3这个结构体中最大对齐数的整数倍处那么最大对齐数就是【8】所以要从8的地址处开始往下放置那要占用多少空间呢这就是s3这个结构体的大小【16】所以一直往下数16个空间即可一直到23这个地址处那么中间的这7个位置就算是浪费了 最后就是这个【d】与VS中的默认对齐数一致所以为【8】下一个24刚好为8整数倍的地址处所以从这开始放double类型的数据在内存中占8个字节所以一直到31的地址处 然后来算整个结构体s4的大小为所有最大对齐数含嵌套结构体的对齐数的整数倍也就是取s3和s4中的最大对齐数那也就是【8】计算一下结构体s4所占的内存空间为32刚好为8的整数倍所以整个结构体的大小即为32 运行结果如下 四、为什么存在内存对齐? 经过了两道例题和两道练习题的训练相信你对如何计算结构体的大小一定是心中有数了但在阅读的过程中你是否有疑惑为什么会存在这个【结构体内存对齐】呢有什么实际意义吗 1、平台原因(移植原因) 不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常  2、性能原因  假设下面有一个结构体内部有两个成员变量c和i然后要在内存中存储它们我分为了两种一个是【无内存对齐】呈现的是紧密存放一个是【内存对齐】需要考虑到最大对齐数然后在32位平台下去分别访问结构体中的成员假设现在读取数据的时候一次性读四个字节。首先看到的是【无内存对齐】的结构体内存分布读一次就能读到 c但是若要全部读取完 i就还需要再读取一次那访问到所有的成员变量就需要两次接下去看到的是【内存对齐】的结构体内存分布因为内存对齐的缘故所有两个成员变量 c和i互不干扰此时再看到成员变量 i从它的初始地址处开始读取一次读4个字节那么读1次就刚刚好可以读完这个变量了而不是像上面那样还需要再读一次 所以原因就在于为了访问未对齐的内存处理器需要作两次内存访问而对齐的内存访问仅需要一次访问。 总体来说 结构体的内存对齐是拿空间来换取时间的做法  struct S1 {char c1;int i;char c2; };struct S2 {char c1;char c2;int i; };了解了为什么会存在内存对齐之后我们再回到一开始的这两个结构体你是否有想过为什么两个结构体的成员变量都一模一样但是大小却是一个【12】一个【8】呢 没错就是你想到的它们所存放的位置不一样罢了。因为要存在内存对齐所以若两个对齐数大的成员变量定义在一起的话为了满足规则就可能会浪费很多空间的内存。但若是两个对齐数较小甚至相同规定的变量定义在一块的话可能它们就是挨着放的占用的空间少了↓那最后结构体的大小就变小了 所以那在设计结构体的时候我们既要满足对齐又要节省空间就要让占用空间小的成员尽量集中在一起  五、如何修改默认对齐数  之前我们见过了 #pragma 这个预处理指令#pragma comment用来链接函数的静态库。这里我们再次使用可以改变我们的默认对齐数  用法很简单#pragma pack(1)就可以设置默认对齐数为1#pragma pack()就可以取消设置的默认对齐数还原为默认。到它为止的默认对齐数还是被修改后的对齐数 接下去就来看下面这个修改完默认对齐数后的结构体它的大小会是多少呢 #pragma pack(1)//设置默认对齐数为1 struct S1 {char c1;int i;char c2; }; #pragma pack()//取消设置的默认对齐数还原为默认int main() {//输出的结果是什么printf(%d\n, sizeof(struct S1));return 0; }可以看到若是默认的对齐数设置为1的话那其实可以看出每个成员变量的对齐数就都是1了那么也就不存在浪费的现象因为任何数都是1的整数倍所以3个成员变量的内存分布如下大小即为【6】 运行结果如下  结论 结构在对齐方式不合适的时候我么可以自己更改默认对齐数  六、实战演练 两道高频面试题 结构体怎么对齐 为什么要进行内存对齐  第一个成员在与结构体变量偏移量为0的地址处其他成员变量要对齐到某个数字对齐数的整数倍的地址处对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 【VS中默认的值为8、Linux环境默认不设对齐数对齐数是结构体成员自身的大小】结构体总大小为最大对齐数每个成员变量都有一个对齐数的整数倍如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍 为什么要进行内存对齐呢原因有两个一个是平台本身的原因任意地址上的任意数据是不能随意访问的如果不正确访问可能会造成硬件异常。第二个就是性能原因为了访问未对齐的内存处理器需要作两次内存访问而对齐的内存访问仅需要一次访问  如何让结构体按照指定的对齐参数进行对齐能否按照3、4、5即任意字节对齐  可以的只需要使用一个预处理指令#pragma pack(3)便可以将默认对齐数修改为3其他的也是同理因为结构体默认对齐数发生了变化此时就会导致结构体大小发生变化  七、共勉 以下就是我对结构体内存对齐的理解如果有不懂和发现问题的小伙伴请在评论区说出来哦同时我还会继续更新对【C/C】的理解请持续关注我哦
http://www.pierceye.com/news/606637/

相关文章:

  • 电子政务网站模版科学规划网页的做法是
  • 昆明网站建设猫咪科技抚州网站建设
  • 山东网站建设运行工资做的很漂亮的网站
  • 网站免费源码大全无用下载淘宝支持做微交易网站吗
  • 常用网站推广方法石家庄营销网站建设价格
  • 网站界面设计的基本原则是什么论坛做视频网站
  • 学校网站总务建设怎么做网站流量竞品分析
  • 企业网站建设所需要的资料网站备案 icp备案
  • 商城类网站方案中国风 wordpress主题
  • 网站更换服务器教程南阳网站推广招聘
  • 海尔网站的建设目标四库一平台个人信息查询
  • 佛山市建设网站公司网站手机端和电脑端
  • 属于c2c的网站是重庆化工建设信息网站
  • 高端大气网站推荐网赌网站建设多少钱
  • 宁波网站关键词优化排名网站修改图片怎么做
  • 苏州网站建设案例购买网站域名
  • 自己做剧本网站重庆建设工业公司官网
  • 中国网站建设中心建网站和开发软件哪个难
  • 优化网站被百度屏阿里云网站备案核验单
  • 肇庆做网站哪家好河北建设工程信息网正规网站
  • 怎么做展示网站公司网站管理规定
  • 娄底网站制作备案号查询平台
  • 青岛网站排名方案优化的定义
  • 微网站开发外包杨浦做网站公司
  • 网站推广服务包括哪些个人简历网官网免费
  • 铜仁住房和城乡建设局网站安贞做网站公司
  • 做网站客户尾款老不给怎么办东莞市研发网站建设品牌
  • 文化网站策划wordpress iscategory
  • 北京社区网站建设wordpress主题 sen
  • 做外贸商城网站重庆seo整站优化方案范文