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

钓鱼网站建设/专业营销策划团队

钓鱼网站建设,专业营销策划团队,电子商务网站设计思路,vs2013可以做网站么原文:https://www.cnblogs.com/AlexMiller/p/5509609.html 字节对齐的原因 为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐。 对齐方式 对于 struct 或 union 中的 struct 或者 union 来说,它…

原文:https://www.cnblogs.com/AlexMiller/p/5509609.html

字节对齐的原因

    为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进行优化,即进行字节对齐

对齐方式

    对于 struct 或 union 中的 struct 或者 union 来说,它们的字节对齐标准就是它的所有成员中字节数最大的数据的字节数。

一般情况下 C/C++ 的变量所占用的字节数

        char:    1字节;

        short:   2字节;

        int:       4字节;

        long:    4字节;

        long long: 8字节;

        float:    4字节;

        double: 8字节;

        bool:    1字节;

*struct 中字节对齐需要满足的条件:对齐两原则

    1、某个变量存放的起始位置相对于结构的起始位置的偏移量该变量字节数的整数倍

    2、结构所占用的总字节数是结构种字节数最长的变量的字节数的整数倍

    例:

复制代码
1 struct Struct
2 {
3     double d1;
4     char d2;
5     int d3;
6 }a;
复制代码

  sizeof(a) = 8 + 1 + 3 + 4 = 16。其中补上的 3 个字节是为了让 int 型数据的起始位置相对于结构起始位置的偏移量为 4 的整数倍

复制代码
1 struct Struct
2 {
3     char d1;
4     double d2;
5     int d3;
6 }b;
复制代码

  sizeof(b) = 1 + 7 + 8 + 4 = 20。 20 / 8 = 2 …… 4,所以需要再补上 4 个字节,使之成为 8 的 整数倍

*union 中字节对齐需要满足的两个条件:对齐两原则

    1、unoin 的大小必须足够容纳最宽的成员

    2、union 的大小需要能够被其所包含的基础成员类型的大小所整除。

 

字节对齐的另一种方式

    VC提供了 #pragma pack(n) 用来自定义字节对齐方式

    有一下两种情况:

        1、n 大于变量的字节数:偏移量只满足默认的字节对齐方式;

        2、n 小于变量所占的字节数:偏移量是 n 的整数倍,不使用默认的字节对齐方式。

    例:

 1 #pragma pack(push)        // 保持对齐状态2 #pragma pack(4)            // 设定为 4 字节对齐3 struct test4 {5     char m1;6    double m2;7    int m3;8 }a;9 #pragma pack(pop)        // 恢复对齐状态
10 sizeof(a) = 1 + 3 + 8 + 4 = 16  // 其中补上三位是因为 n 小于 8,所以 m2 的起始位置相对于结构起始位置的偏移量是 n,即为 4.
11 
12 
13 #pragma pack(8)
14 struct S1
15 {
16   char a;
17   long b;
18 };
19 struct S2
20 {
21   char c;
22   struct S1 d;
23   long long e;
24 };
25 #pragma pack()
26 
27 sizeof(S1) = 1 + 3 + 4 = 8
28 sizeof(S2) = 1 + 3 + 8 + 4 + 8 = 24// 其中加上的 4 是因为变量 e 的字节数是 8 ,其相对与起始位置的偏移量必须是 8 的倍数。???

 

字节对齐问题的讨论到上边已经结束了。下面再加上我碰到的两道题目作为实例:

1、典 ⭐⭐⭐

 1 #include <stdio.h>2 union3 {4     char x[5];5     int i;6 }a;7 8 int main()9 {
10     a.x[0] = 10;
11     a.x[1] = 1;
12     printf("%d\n", a.i);
13     printf("%d\n", sizeof(a));
14     return 0;
15 } 

 

输出为 266 8

解析:

对 union 分配内存涉及字节对齐问题,在上方已有详细描述,在此只简单解释一番。union 分配的内存必须是 union 中所有基本数据类型的倍数
在此题中即为 1 和 4 的倍数,又 char x[5] 占用 5 个字节,故 union 分配的内存大小应为 8 个字节。
windows 系统中高字节在后,低字节在前。而 char x[5] 只有前两个元素有值,即两个值只占 2 个字节,也即 union 中的 int 型数据中只有低两位上有值。
即 i 的二进制表示为:
    00000000 00000000 00000001 00001010
    即: 2^1 + 2^3 + 2^8 = 266
也相当于十六进制 0x010A, 即: 10 * 16^0 + 1 * 16^2 = 266

题2

struct T {  char a;  int *d;  int b;  int c:16;  double e;  
};  
T *p;  
在64位系统以及64位编译器下,以下描述正确的是

正确答案: C   你的答案: C (正确)

A:sizeof(p) == 24  (8)
B:sizeof(*p) == 24  (32)
C:sizeof(p->a) == 1  
D:sizeof(p->e) == 4  (8)

a占一个字节(注:地址为[0]),d作为64位指针占8个字节(注1:32位占四个字节,p也一样)(注2:根据上面的准则2,d的偏移量要为8的整数倍,所以d的地址为[8]-[15],而非[1]-[8],下同),b占了4个字节(注:地址为[16][19]),c指定为16为,占了两个字节(注:地址为[20,21]),e占8个字节,(同d的分析一样,e的地址应该为[24][31]),所以A的答案应该是8,B的答案是32,C正确,D的答案为8。

这里补充一下进制转换问题,也是我一并搜集来的:

进制互相转换

十进制0123456789101112131415
十六进制0123456789ABCDEF
二进制0000000100100011010001010110011110001001101010111100110111101111

  十六进制数字转换十进制数字:         

    0x2AF5转换十进制:            

      5 * 16^0 = 5            

      F * 16^1 = 240            

      A * 16^2 = 2560            

      2 * 16^3 = 8192            

      ---------------            

      5 + 240 + 2560 + 8192 = 10997    

  十进制数字转换十六进制数字:        

    2500转换十六进制:            

      2500 / 16 = 156 …… 4            

      156 / 16 = 9 …… 12(C)            

      9 / 16 = 0 …… 9            

      ----------------------            

      得到4C9,倒转9C4,即2500的十六进制表示是: 0x9C4    

  二进制数字转换十六进制数字:        

    101110011011.1001        

    采取四合一法,即以二进制的小数点为分界点,向左(或向右)每四位取一位。        

    组分好以后,对照二进制与十六进制数的对应表,将四位二进制按权相加,得到的数就是一位十六进制数,然后按顺序排列,小数点的位置不变。        

    结果为:B9B.9        

    需要注意的是,在向左(或向右)取四位时,取到最高位(最低位)如果无法凑足四位,就可以在小数点的最左边(或最右边)补0,进行换算。    

  十六进制数字转换二进制数字:  

    对照二进制与十六进制数的对应表,将十六进制数分为二进制数字,用四位二进制数字按权相加,最后得到二进制数字,小数点依旧。

 

2、

复制代码
 1 #include <iostream>2 using namespace std;3 4 typedef struct A5 {6     char aChar;7     int aInt_2;8     short aInt;9 }TypeA;
10 
11 typedef struct B
12 {
13     char bChar[3];
14     TypeA bA;
15     double bDouble;
16 }TypeB;
17 
18 int main()
19 {
20     TypeA a;
21     TypeB b;
22     cout << sizeof(a) << endl << sizeof(b) << endl;
23     return 0;
24 }
复制代码

输出为 12 24

解析:

由上述对字节对齐问题的讨论很容易便可以得出此题的答案。
sizeof(TypeA) = 1 + 3 + 4 + 2 = 10。 10 / 4 = 2 …… 2,故需要再补上 2 个字节,即 sizeof(TypeA) = 12;
sizeof(TypeB) = 3 + 1 + 12 + 8 = 24。之所以补上 1 个字节是因为 TypeA 类型在 struct TypeB 中的默认对齐方式
是 4 个字节(即 int 的字节大小,也即 struct TypeA 中最长的字节)。

转载于:https://www.cnblogs.com/Ph-one/p/8544438.html

http://www.jmfq.cn/news/4843639.html

相关文章:

  • 东坑仿做网站/快速收录网
  • 什么网站做兼职可靠/合肥网站seo推广
  • 政府部门门户网站建设方案/企业网站模板下载
  • 辽宁网站建设学校/爱站查询
  • wordpress做排行榜单/优化seo培训班
  • 景观设计公司排名前十强/聊城seo优化
  • 注册外贸公司的流程及费用/亚马逊seo关键词优化软件
  • 做室内设计的网站有哪些方面/net的网站建设
  • 怎么样做网站爬虫/qq推广平台
  • 优建网站/新品推广活动方案
  • 让路由器做网站服务器/公司网站免费自建
  • 做系统之前的网站/小学生抄写新闻20字
  • 广州网站建设企业/衡阳百度推广
  • 个旧市建设局网站/app拉新项目
  • 发布了一个网站 显示建设中/平台连接
  • 做网站需要的素材照片/最常见企业网站公司有哪些
  • 东莞定制网站建设/2023年九月份新闻
  • 网站开发和设计/黑帽seo之搜索引擎
  • 网站建设技术标准/推广方式有哪些?
  • 阿里云网站的网页怎么做/广告投放是做什么的
  • 重庆网站公司设计/百度seo软件是做什么的
  • html怎么做网站地图/产品推广ppt范例
  • 网站首页快照怎么做/关键词推广优化外包
  • 网站 数据库空间 50mb/企业seo职位
  • 网站浏览器兼容性测试/百度竞价推广方案的制定
  • 如何做一个购物网站页面/千川推广官网
  • 街道政府网站三基建设汇报/自己如何做一个网站
  • 动漫一级a做爰片免费网站/app开发费用一般多少钱
  • 互动网站欣赏/陕西seo快速排名
  • 如何建一个企业网站/河南最新消息