返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 内存对齐详解_百度文库
 第2代22nm工艺!4款HASWELL处…
 nand闪存
 java中cpu缓存一致性对编程有…
 800元左右有可能开出RTX 309…
 23显卡价格(4090也绷不住了…
 炸了!!!亚马逊40亿美元投…
 各个品牌显卡点评
 显卡价格行情(2022年1月18日…
 电源是如何滤波的?电路中的…
 高性能计算
 200家参展企业集结完毕只待新…
 中国创造奇迹!屠呦呦获诺贝…
 为什么正激式开关电源电路只…
 云存储是什么意思
 中国移动第一批SSD硬盘AVAP合…
 西数黑盘和蓝盘的区别
 硬盘盒PCBA设计才是王道
 希捷推出Exos系列24TB硬盘:…
 25年全面关怀 惠普打印服务始…
 消费者投诉:惠普产品存在质…
 惠普新款电脑黑屏问题频发售…
 惠普公布问题电脑维修细则:…
 打印机钻进蟑螂导致故障 惠普…
 商务部电子商务司负责人介绍…
 传统消费季焕发家居消费新活…
 网络营销渠道与传统营销渠道…
 电商平台的营销方式有哪几种
 基于传统网络渠道的网络营销
 笔记本电脑cpu排行榜2022(笔…
 笔记本电脑cpu型号后面的K U…
 2023年哪一款笔记本电脑值得…
 cpu排行榜笔记本电脑cpu排行…
 笔记本电脑cpu排行榜天梯202…
 DIY电脑硬件
 有哪些性价比高的电脑显示器…
 笔记本怎么投屏到显示器 笔记…
 Win11扩展屏幕怎么设置 Win1…
 深纺织A:公司产品偏光片是显…
 显卡插在主板哪个槽
 显卡接口具体都有哪些?
 指南]显卡与主板连接采纳的接…
 市场上常见的显卡上都有哪些…
 显卡插槽接口类型 -电脑资料
 内存条水条是什么意思
 宇瞻内存条英文怎么写(内存…
 英伟达升级GRACE-HOPPER GPU…
 电脑蓝屏全是英文怎么解决
 LPDDR5和LPDDR4X内存还傻傻分…
 显卡发展历史ppt
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
内存对齐详解_百度文库
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/10/24 2:48:24 | 【字体:

  金刚法神2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。

  下面再举个例子,交换一下上面的MyStruct的成员变量的位置,使它变成下面的情况:

  这个结构占用的空间为多大呢?在VC6.0环境下,可以得到sizeof(MyStruc)为24。结合上面提到的分配空间的一些原则,分析下VC怎么样为上面的结构分配空间的。(简单说明)

  };//所有成员变量都分配了空间,空间总的大小为1784=20,不是结构

  现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

  S2中,c和S1中的a一样,按1字节对齐,而d是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.

  各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

  3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。

  备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。

  对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。

  但是当在VC中测试上面结构的大小时,你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗?

  其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。

  以上结构的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1占用1个字节。接着开始为m4分配空间,这时其偏移量为1,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于n),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16),那么我们可以得到结构的大小为24。(请读者自己分析)

  VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。

  VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;

  //(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为

  3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。

  备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。

  每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编

  译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

  数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset

  也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.

  S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;

  为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof (int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8134=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=81 34=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。

  2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

  备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。

  1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬

  2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问

  未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

  为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

  结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进

  行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

  成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.

  结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 内存对齐详解_百度文库 (10-24)
    普通电脑内存 第2代22nm工艺!4款HASWELL处理器导购 (10-24)
    普通电脑内存 nand闪存 (10-24)
    普通电脑内存 java中cpu缓存一致性对编程有什么帮助 (10-24)
    普通电脑内存 内存条水条是什么意思 (10-23)
    普通电脑内存 宇瞻内存条英文怎么写(内存条有什么作用) (10-23)
    普通电脑内存 英伟达升级GRACE-HOPPER GPU内存着力为大语言… (10-23)
    普通电脑内存 电脑蓝屏全是英文怎么解决 (10-23)
    普通电脑内存 LPDDR5和LPDDR4X内存还傻傻分不清?带你一文看… (10-23)
    普通电脑内存 电脑虚拟内存什么意思什么叫做虚拟内存 (10-23)
    普通电脑内存 虚拟存储器的英文简称为____。 (10-23)
    普通电脑内存 计算机系统之虚拟内存 (10-23)
    普通电脑内存 电脑虚拟内存是什么? (10-23)
    普通电脑内存 PD虚拟机如何分配内存和CPU核数 (10-23)
    普通电脑内存 恒生电子UF30内存交易产品正式发布 (10-22)
    普通电脑内存 巴掌大小 超高性能 办公和游戏都很行!机械师… (10-22)
    普通电脑内存 三星推出“Shinebolt”HBM3E内存 可以满足下一… (10-22)
    普通电脑内存 浙商证券给予恒生电子买入评级恒生电子点评报… (10-22)
    普通电脑内存 电脑内存条是什么 电脑内存条介绍【详解】 (10-22)
    普通电脑内存 电脑选购的时候要考虑的一些地方(一) (10-21)