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

北京做建筑信息的网站临安网站seo

北京做建筑信息的网站,临安网站seo,服装设计学院,网站开发维护印花税目录1. 内存对齐规则2. 简单易懂的内存对齐示例2.1 简单结构体2.2 含位域的结构体2.3 空类的大小2.4 嵌套结构体3. 为什么需要内存对齐?4. 类型在不同系统下所占字节数1. 内存对齐规则 第一个成员在与结构体变量偏移量为0的位置处。其他成员变量要对齐到某个数字&a…

目录

  • 1. 内存对齐规则
  • 2. 简单易懂的内存对齐示例
    • 2.1 简单结构体
    • 2.2 含位域的结构体
    • 2.3 空类的大小
    • 2.4 嵌套结构体
  • 3. 为什么需要内存对齐?
  • 4. 类型在不同系统下所占字节数

1. 内存对齐规则

  1. 第一个成员在与结构体变量偏移量为0的位置处。
  2. 其他成员变量要对齐到某个数字(对其数)的整数倍的地址处。对其数=编译器默认的一个对齐数与该成员大小的较小者。vs中默认的值是8 Linux中默认的值是4
  3. 结构体总大小为最大对其数(每一个成员变量都有一个对其数)的整数倍。
  4. 如果嵌套了结构体对齐到自己的最大对其数是整数倍处,结构体的整体大小就是最大对齐数(含嵌套结构体的对齐数)的整数倍。
  5. 如对内存对齐有明确要求,可用#pragma pack(n)指定(n必须是2的N次方),以n和结构体中最长数据成员长度中较小者为有效值

可能只看上面的描述你还是有点搞不懂,那么我们可以看一下具体的例子和视图讲解:

struct s1{char c1;int i;char c2;
};
//结构体总大小为:12

在这里插入图片描述

2. 简单易懂的内存对齐示例

2.1 简单结构体

struct s1
{char str;  //1字节short x;   //2字节int num;   //4字节
};
// sizeof(s1) = 8     // (1+1) + 2 + 4 = 8  第2个加1处的内存是空的

2.2 含位域的结构体

一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。

struct s2
{unsigned char a:7;  //字段a占用了一个字节的7个bitunsigned char b:2;  //字段b占用了2个bitunsigned char c:7;  //字段c占用了7个bit
}s1;
// sizeof(s1) = 3  // 1 + 1 + 1 = 3
struct s3
{char t : 4;   //4表示在一个字节中占4个比特位char k : 4;
}; 
// sizeof(s3) = 1   //0.5 + 0.5 = 1
struct s4
{char t : 4;   //4表示在一个字节中占4个比特位char k : 4;unsigned short i : 8;char a;
}; 
// sizeof(s4) = 6   //(0.5 + 0.5 + 1) + 2 + (1+1) = 6
// 解释:0.5和0.5占一个字节,两个占4比特的刚好可以放在一个字节中,short为2字节,对齐数是2,所以0.5 + 0.5 + 1中加的1是空的

2.3 空类的大小

class A {};
// sizeof(A) = 1

空类,没有任何成员变量和成员函数,编译器是支持空类实例化对象的,对象必须要被分配内存空间才有意义,大小: 1Byte (字节)

2.4 嵌套结构体

class A {
private:double dd;int ii;int* pp;
};class Test {
private:int i;A a;double d;char* p;
};
int main()
{A a1;Test test;cout << sizeof(a1) << endl;cout << sizeof(test) << endl;
}
// x86(32位操作系统)平台运行结果:40
// x64(64位操作系统)平台运行结果:48

对其数 = 编译器默认的一个对齐数与该成员大小的较小者,vs中默认的值是8

  • x86:指针是4字节,类A的大小是16,8与16的较小者是8。内存大小为:8 + 16 + 8 + 4 = 36,又因为36不是最大对齐数8的倍数,所以内存向后偏移,大小为 40

  • x64:指针是8字节,类A大小为24,8与24的较小者是8。内存大小为:8 + 24 + 8 +8 = 48,48刚好是最大对齐数8的倍数,所以内存大小为48

3. 为什么需要内存对齐?

字节对齐主要是为了提高内存的访问效率

cpu一次能读取多少内存要看数据总线是多少位,如果是16位,则一次只能读取2个字节,如果是32位,则可以读取4个字节,并且cpu不能跨内存区间访问
假设有这样一个结构体如下:

struct s
{char a;int b;
};

假设地址空间是类似下面这样的:
在这里插入图片描述

  • 在没有字节对齐的情况下,变量a就是占用了0x00000001这一个字节,而变量b则是占用了0x00000002~0x000000005这四个字节,那么cpu如果想从内存中读取变量b,首先要从变量b的开始地址0x00000002读到0x0000004,然后再读取一次0x00000005这个字节,相当于读一个int,cpu从内存读取了两次。

  • 而如果进行字节对齐的话,变量a还是占用了0x00000001这一个字节,而变量b则是占用了0x00000005~0x00000008这四个字节,那么cpu要读取变量b的话,就直接一次性从0x00000005读到0x00000008,就一次全部读取出来了。

  • 所以说,字节对齐的根本原因其实在于cpu读取内存的效率问题,对齐以后,cpu读取内存的效率会更快。结构体的内存对齐是拿空间来换取时间的做法

4. 类型在不同系统下所占字节数

类型win32win64linux32linux64
char1111
short2222
int4444
long4448
long long8888
float4444
double8888
void*(指针)4848

在这里插入图片描述

http://www.hkea.cn/news/916403/

相关文章:

  • 手机网站可以做英文版本吗近三天时政热点
  • 怎么做网站游戏网络优化排名培训
  • ic外贸网站建设黑帽seo技巧
  • 实业有限公司网站怎么做百度一下了你就知道官网
  • 企业电子商务网站推广平台有哪些渠道
  • 本地用织梦做网站百度的网站网址
  • 基础展示营销型型网站新闻发稿平台有哪些
  • 做游戏赚钱的网站最新新闻热点事件2022
  • 商务网站建设哪家好推广代理公司
  • 自己做网站是否要买云主机西安百度提升优化
  • 成都注册公司哪个区好分析网站推广和优化的原因
  • 模板建站杭州seo泽成
  • 济南网站建设公司川芎网络怎么注册自己的网址
  • linux下安装wordpress关键词优化排名查询
  • wordpress手机网站怎么做中央电视台一套广告价目表
  • 百家号如何给网站做推广推广方案是什么
  • 西安三网合一网站建设产品线上推广方案
  • 2023年免费b站入口百度网站优化
  • 响应式网站建设有利于seo网站发布与推广方案
  • 网页制作教程课件seo推广排名重要吗
  • 小规模纳税人企业所得税怎么征收广州seo招聘
  • 济南企业自助建站网络营销策划公司
  • iis 新建网站 要登录温州seo推广外包
  • 个人想做企业网站备案惠州seo代理商
  • 做公务员题的网站口红的推广软文
  • 福州网站建设 联系yanktcn 04上海百网优seo优化公司
  • 网站备案号如何获得网站建设营销推广
  • 物流网站开发公司西安 做网站
  • 商务信息网站怎么做网络视频营销策略有哪些
  • 社交做的最好的网站怎么开发一个网站