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

桂林网站制作做网站详细步骤

桂林网站制作,做网站详细步骤,网站开发案例,崇川网站建设结构体大小的计算往往是面试笔试常考的知识。对于简单的结构体#xff0c;可以一眼看出来#xff0c;对于复杂的结构体#xff0c;该如何计算结构体占用内存的大小呢?本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Windows 上的编译器有可能不太一样。 文章目录… 结构体大小的计算往往是面试笔试常考的知识。对于简单的结构体可以一眼看出来对于复杂的结构体该如何计算结构体占用内存的大小呢?本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Windows 上的编译器有可能不太一样。 文章目录1 什么是内存对齐2 struct占用的内存大小如何计算2.1 struct结构体大小计算案例分析-结构体中没有结构体2.2 struct结构体大小计算案例分析-结构体中有一个结构体成员3 总结 1 什么是内存对齐 先来加单的说一下为什么需要内存对齐 CPU对内存的读取不是连续的而是分成块读取的块的大小只能是1,2,4,8,16…字节当读取的数据未对齐则需要两次总线周期来访问内存才能将整个数据读完这样会降低CPU性能某些硬件平台只能从规定的相对地址处读取特定类型的数据否则产生硬件异常 什么是内存对齐 不同类型的数据在内存中按照一定的规则排列但是不一定是顺序的一个接一个的排列 例如下图中的两个结构体的大小是不一样的因为它们的内存布局是不一样的 它们的内存布局如下图 拓展 #pragma pack 用于指定内存的对齐方式。用于修改编译器的默认对齐方式 一般来讲在Linux系统中编译器的默认对我方式是4字节对齐。下图中的代码可以将对齐方式修改为1字节对齐 2 struct占用的内存大小如何计算 对于不同的内存对齐方式上面的结构体在内存中的布局是不一样的那么我们如何来计算不同的对齐方式在内存中的布局是什么样的呢 需要根据以下三点 第一个struct成员永远起始于 0偏移处 每个成员按其类型大小和pack参数中较小的一个 进行对齐 2.1 偏移地址必须能被对齐参数整除 2.2 如果一个结构体中有一个变量也是结构体那么这个内部的结构体成员的对齐大小就按照其内部最大的数据成员作为其大小来计算。这里有点绕看最后的一个例子就会明白 结构体总长度必须为所有对齐参数的整数倍 只需要按照上述三点计算方法就可以计算出所有结构体的大小以及内存布局的样式 2.1 struct结构体大小计算案例分析-结构体中没有结构体 如下面的代码 24-3.c #include stdio.h#pragma pack(2) struct Test1 {char c1;short s;char c2;int i; }; #pragma pack()#pragma pack(4) struct Test2 {char c1;char c2;short s;int i; }; #pragma pack()int main() {printf(sizeof(Test1) %d\n, sizeof(struct Test1));printf(sizeof(Test2) %d\n, sizeof(struct Test2));return 0; }编译运行结果为 sizeof(Test1) 10 sizeof(Test2) 8 结果分析1–Test1 对于结构体Test12字节对齐按照上述三个计算条件有 struct Test1 { //对齐方式 大小 起始地址 占用的内存地址位置 char c1; 2 大于 1 0 0 short s; 2 等于 2 2(被对齐参数2整除) 2~3 char c2; 2 大于 1(对齐参数) 4 4 int i; 2(对齐参数) 小于 4 6(被对齐参数2整除) 6~9 }; Test1的对齐方式是2字节。 然后根据 每个成员按其类型大小和pack参数中较小的一个 进行对齐。比如上面的起始地址计算那里都是被对齐参数2整除这个2是类型大小和pack参数中较小的一个 2.1 偏移地址必须能被对齐参数整除 这一条规则计算每个成员的起始地址。如上面的计算。 最后再看总体大小是否是对齐参数的整数倍。上面Test1 大小是10是对齐参数2的整数倍 结果分析2–Test2 对于结构体Test24字节对齐按照上述三个计算条件有 struct Test2 { //对齐方式 大小 起始地址 占用的内存地址位置 char c1; 4 大于 1(对齐参数) 0 0 char c2; 4 大于 1(对齐参数) 1(被对齐参数1整除) 1 short s; 4 大于 2(对齐参数) 2(被对齐参数2整除) 2~3 int i; 4 等于 4(对齐参数) 4(被对齐参数4整除) 5~7 };Test2 的对齐方式是4字节对齐 然后再根据 每个成员按其类型大小和pack参数中较小的一个 进行对齐。比如上面的起始地址计算那里对齐参数分别为1,1,2,4 2.1 偏移地址必须能被对齐参数整除 这一条规则计算每个成员的起始地址。如上面的计算。 最后再看总体大小是否是对齐参数的整数倍。上面Test2 大小是8是对齐参数4的整数倍 经过上面的两个结构体大小的计算可以很容易的画出其内存图 2.2 struct结构体大小计算案例分析-结构体中有一个结构体成员 再看一个复杂的结构体大小的计算 代码 24-4.c #include stdio.hstruct S1 {short a;long b; };struct S2 {char c;struct S1 d;double e; };int main() {printf(sizeof(struct S1) %d\n, sizeof(struct S1));printf(sizeof(struct S2) %d\n, sizeof(struct S2));return 0; }运行结果为 sizeof(struct S1) 8 sizeof(struct S2) 20 S1很好分析。下面我们分析S2 struct S2 //对齐方式 大小 起始地址 占用的内存地址位置 {char c; 4 大于 1(对齐参数) 0 0 struct S1 d; 4 等于 4(这个是S1中最大参数大小) 4(被4整除) 4~11S1实际大小为8 double e; 4(对齐)小于 8 12(被4整除) 12~19 };注意 上面S2中的S1实际大小是8那个4是作为与对齐方式比较时选取较小的作为对齐参数选取S1中最大的数据成员大小。 S2 的对齐方式是4字节对齐 然后再根据 每个成员按其类型大小和pack参数中较小的一个 进行对齐。比如上面的起始地址计算那里对齐参数分别为0,4,12 2.1 偏移地址必须能被对齐参数整除 2.2 如果一个结构体中有一个变量也是结构体那么这个内部的结构体成员的对齐大小就按照其内部最大的数据成员作为其大小来计算 这一条规则计算每个成员的起始地址。如上面的计算。 最后再看总体大小是否是对齐参数的整数倍。上面S2 大小是20是对齐参数4的整数倍 我所使用的编译器gcc 4.4.5 不支持8字节对齐方式 3 总结 注意好好理解上述计算结构体大小的计算方法。然后自己画画内存图。
http://www.pierceye.com/news/778051/

相关文章:

  • 网站导航栏兼容性网站建设的主要技术指什么软件
  • 如何抄袭网站400靓号手机网站建设
  • 大兴网站建设价格怎样建设好网站
  • 三维家是在网站上做还是在app上国内新闻最新5条
  • 呼伦贝尔网站设计wordpress如何关闭主题
  • 苏州网站制作网站建设淮安住房和城乡建设厅网站
  • 房产中介网站wordpress模板mip
  • 汽车租赁网站怎么做沈阳网站开发程序员工资
  • 网站建设教程搭建汽岁湖南岚鸿专注交城有做网站的吗
  • 网站开发怎么连接sqlserver建设网站怎么收费标准
  • 万网网站模板购买北京南站核酸检测地点
  • 南京城乡建设网站公司做网站哪个好
  • 有没有学做衣服的网站广告设计公司有什么岗位
  • 什么网站做免单衣服厦门设计师网站
  • 深圳网站建设 龙华信科易乐自助建站
  • 徐老师在那个网站做发视频搜索引擎优化特点
  • 工信部网站备案批准文件重庆装修网站建设
  • 网站被攻击了怎么办网站优化 价格查询
  • 北京网站建设公司怎么样怎么做qq盗号网站
  • 中企动力网站建设合同中天建设招标网站
  • 湖南手机版建站系统开发wordpress获取用户角色
  • 南皮网站建设价格泰安房产信息网官网首页
  • 网页制作与网站建设实战大全重庆房产信息网官网
  • 上海的网站建设公司app对接网站登录要怎么做
  • 江苏省备案网站现在什么网站做外贸的最好
  • 如何知道网站是否被k蓝山网站建设
  • 网站维护服务公司免费的网站推广渠道
  • 网站建设方案应该怎么写asp网站无法上传图片
  • 建个网站多少钱app企业关键词排名优化公司
  • 电子商务他们的代表网站代码网站怎么做的