澳门1495

1495娱乐关于内存对共同。C内存对一起。

九月 27th, 2018  |  综合体育

一.内存对齐的启讲解

内存对伙同可以用同句子话来概括:

转自:http://blog.csdn.net/hbuxiaofei/article/details/9491953

“数据项只能存储在地点是数码项大小的平头加倍的内存位置及”

   
当您望这题目,仍惦记为下念之上证实您既初步关心数据在内存存储问题了。

诸如int类型占用4个字节,地址只能在0,4,8顶岗位及。

   
好吧,下面先想一个题材:

例1:

struct  stu{
char sex;
int length;
char name[10];
};
sizeof (struct  stu) = ???

#include <stdio.h>
struct xx{
        char b;
        int a;
        int c;
        char d;
};

设您的答案是:15
。那若该仔细看下面的分析了!!!!

int main()
{
        struct xx bb;
        printf(“&a = %p/n”, &bb.a);
        printf(“&b = %p/n”, &bb.b);
        printf(“&c = %p/n”, &bb.c);
        printf(“&d = %p/n”, &bb.d);
        printf(“sizeof(xx) = %d/n”, sizeof(struct xx));

一、概念 
 
   
对合跟数据在内存中的职位有关。如果一个变量的内存地址正好在其长的整数倍增,他即便叫如做当然对一头。比如在32位cpu下,假要一个整型变量的地方也0x00000004,那其就是是理所当然对旅之。
 
仲、为什么要字节对共同
 
   
需要字节对旅之根本原因在于CPU访问数的频率问题。假设上面整型变量的地方不是理所当然对联合,比如为0x00000002,则CPU如果获其的值的说话需要拜访片次内存,第一软沾从0x00000002-0x00000003底一个short,第二浅得到从0x00000004-0x00000005的一个short然后成取得所要之数,如果变量在0x00000003地点上之说话虽使顾三不良内存,第一不行啊char,第二不行为short,第三不善也char,然后成得整型数据。而如果变量在自然对一起位置上,则要同不成就好取出数据。一些系统对针对性合要求非常严峻,比如sparc系统,如果博不对同步的数据会发生错误,举个例:
 
char ch[8];
char *p =
&ch[1];
int i = *(int
*)p;
 

        return 0;
}

  运行时会报segment
error,而以x86上即不会见产出谬误,只是效率下降。

尽结果如下:

老三、正确处理字节对齐

&a = ffbff5ec
&b = ffbff5e8
&c = ffbff5f0
&d = ffbff5f4
sizeof(xx) = 16

   
对于规范数据列,它的地方只要是她的长的平头倍即尽了,而无标准数据类按下的规格对旅:

会面意识b与a之间空来了3只字节,也就是说在b之后的0xffbff5e9,0xffbff5ea,0xffbff5eb空了下,a直接存储在了0xffbff5ec,
因为a的大小是4,只能存储在4个整数倍增之职务上。打印xx的尺寸会意识,是16,有些人或者使咨询,b之后空出了3单字节,那也当是13啊?其余的3独
呢?这个通往后看本文会懂得的复深入一些,这里大概说一下就算是d后止的3单字节,也会见浪费掉,也就是说,这3独字节也被这个结构体占用了.

  数组:按照基本数据列对伙同,第一独对合了尾的当然吧就对准旅了。 
  同:按那蕴藉的长度最要命的数据类型对一头。 
  结构体:结构体中每个数据类型都使对准合。
  比如来如下一个结构体:

可以简简单单的改结构体的结构,来下滑内存的动,例如可以拿组织体定义为:
struct xx{
        char b; 
        char d;
        int a;          
        int c;                  
};

struct stu{
char sex;
int length;
char
name[10];
};
struct stu
my_stu;
 

这么打印是结构体的轻重缓急就是12,省了成百上千上空,可以见到,在概念结构体的时光,一定要是考虑要内存对一头之震慑,这样能够如我们的程序占用更粗的内存。

  由于在x86下,GCC默认按4字节本着共同,它见面当sex后面跟name后面分别填写充三单同个别只字节使length和万事结构体对伙同。于是我们sizeof(my_stu)会取得长度也20,而非是15.

二.操作系统的默认对齐系数

四、__attribute__选项


个操作系统还发生好之默认内存对齐系数,如果是新本子的操作系统,默认对齐系数一般还是8,因为操作系统定义之顶要命种存储单元就是8独字节,例如
long
long定要这么,不存在超8只字节的档次(例如int是4,char是1,long在32个编译时凡4,64员编译时是
8)。当操作系统的默认对齐系数与第一省所云的内存对旅的反驳出冲突时,以操作系统的针对齐系数为基准。(例如
操作系统默认的对齐系数也 4 , 那么char类型的数目就是只能有0 , 4 ,8
等4的倍数地址上; 假设操作系统的默认对齐系数是4,那么对和long
long这个路的变量就不满足第一节约所说之,也就是说long
long这种结构,可以储存于被4收拾除的职务及,也得储存于为8疏理除的职及。)

  我们好按照自己设定的对齐大小来编译程序,GNU以__attribute__选取来设置,比如我们纪念被刚刚的组织以一字节对旅,我们得以如此定义结构体

好经#pragma pack()语句修改操作系统的默认对齐系数,

struct stu{
char sex;
int length;
char
name[10];
}__attribute__
((aligned (1))); 

例2:

struct stu
my_stu;
 

#include <stdio.h>
#pragma pack(4)
struct xx{
        char b;
        long long a;
        int c;
        char d;
};
#pragma pack()

  则sizeof(my_stu)可以博大小也15。

int main()
{
        struct xx bb;
        printf(“&a = %p/n”, &bb.a);
        printf(“&b = %p/n”, &bb.b);
        printf(“&c = %p/n”, &bb.c);
        printf(“&d = %p/n”, &bb.d);
        printf(“sizeof(xx) = %d/n”, sizeof(struct xx));

  上面的概念等同于

        return 0;
}
打印结果吗:

struct stu{
char sex;
int length;
char
name[10];
}__attribute__
((packed)); 
struct stu
my_stu;
 

&a = ffbff5e4
&b = ffbff5e0
&c = ffbff5ec
&d = ffbff5f0
sizeof(xx) = 20

__attribute__((packed))得变量或者结构体成员利用最小的针对性齐方式,即对变量是一致配节约对合,对域(field)是个对齐.

发现占用8独字节的a,存储于了不克于8打点除之职上,存储在了深受4规整除之职位上,采取了操作系统的默认对齐系数。

五、什么时用装对齐

三.内存对齐产生的原由

当规划不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的组织就半独地方都急需按照一字节本着同步。即使看起自然就自然对一起的吧只要使该针对性一头,以免不同的编译器生成的代码不一样.

 

 

内存对共同是操作系统为快速访问内存而利用的一模一样栽政策,简单的话,就是为放置变量的亚赖拜访。操作系统在走访内存
时,每次读取一定之长(这个尺寸就是操作系统的默认对齐系数,或者是默认对齐系数的整数倍)。如果无内存对联合时,为了读取一个变量是,会生出总线的第二
次于做客。

一律、快速解

譬如说假设没有内存对共同,结构体xx的变量位置会冒出如下情况:

   
1. 呀是字节对伙同?

struct xx{
        char b;         //0xffbff5e8
        int a;            //0xffbff5e9       
        int c;             //0xffbff5ed      
        char d;         //0xffbff5f1
};

   
在C语言中,结构是一模一样种复合数据类型,其重组要素既可以是中心数据列(如int、long、float等)的变量,也得是一些复合数据类型(如数组、结构、联合等)的数单元。在组织被,编译器为组织的每个成员按照该当边界(alignment)分配空间。各个成员按照其于声称的逐条以内存中顺序存储,第一只分子的地址及通结构的地点一样。

操作系统先念取0xffbff5e8-0xffbff5ef的内存,然后以朗诵取0xffbff5f0-0xffbff5f8底内存,为了取值c,就得拿两组内存合并,进行整理并,这样严重下降了内存的访效率。(这就是干到了外常谈的题材,空间以及频率哪个更关键?这里不做讨论)。

   
为了使CPU能够对变量进行高效的看,变量的开始地址应该有某些特征,即所谓的”对合”.比如4字节底int型,其开场地址应该在4字节之境界上,即开始地址能够吃4疏理除.

这样大家便能理解为什么结构体的率先独变量,不管项目如何,都是能够吃8收拾除之吧(因为访问内存是从8的整数倍增开始之,为了充实读取的频率)!

   
2. 字节本着联合出什么打算?

 

   
字节对合之作用不仅是有利cpu快速访问,同时合理之应用字节对同步可以使得地节约存储空间。

内存对一头之题材要存在为了解struct等复合结构以内存中之遍布。

   
对于32位机来说,4字节本着一头会如cpu访问速度提高,比如说一个long类型的变量,如果超过了4字节边界存储,那么cpu要读博鲜蹩脚,这样效率就没有了。但是当32位机中使用1字节或2字节对一起,反而会使变量访问速度降低。所以马上要考虑处理器类型,另外还得考虑编译器的型。在vc中默认是4字节对旅的,GNU
gcc 为是默认4字节对共同。

首先要清楚内存对一头之定义。
众多其实的计算机体系针对骨干项目数据在内存中存放的岗位发生限制,它们会要求这些多少的首地址的值是有数k(通常它们吧4还是8)的翻番,这虽是所谓的内存对同。

   
3. 又改C编译器的缺省字节对齐方式

此k在不同的cpu平台下,不同之编译器下显现吧大相径庭。比如32号字长的微处理器和16各类字长的处理器。我们的开销主要涉嫌个别生平台,windows和linux(unix),涉及的编译器也要是microsoft编译器(如cl),和gcc。

   
在缺乏省气象下,C编译器为各国一个变量或是数据单元按那本来对界条件分配空间。一般地,可以经下面的点子来改变缺省之对界条件:
· 使用伪指令#pragma pack (n),C编译器将依n个字节对同步。
· 使用伪指令#pragma pack (),取消于定义字节本着齐方式。

内存对合之目的是使各个基本数据列的首地址为对应k的倍数,这是明白内存对齐方
式的终极法宝。另外还要分编译器的个别。明白了当时有限点多就是会搞定所有内存对齐方面的题材。

   
另外,还有如下的等同栽艺术:
· __attribute((aligned
(n))),让所打算的构造成员对伙同在n字节本边界及。如果组织被有成员的长逾n,则仍最要命成员的长短来对一起。
· __attribute__
((packed)),取消结构在编译过程中之优化对合,按照实际占用字节数进行针对旅。

差编译器中之k:
1、对于microsoft的编译器,每种基本型的大大小小就为之k。大体上char类型为8,int为32,long为32,double为64。
2、对于linux下之gcc编译器,对于超过等于4字节之分子的起始 位置应该处于4字节的整数倍增及,对于2字节成员的开局位置应该处于2字节的平头倍增及,1字节之发端位置任意。

    4. 举例说明

知了上述之证实对struct等复合结构的内存分布就应当十分清楚了。

例1

脚看一下不过简易的一个列:struct中成员还为核心数据列,例如:
struct test1
{
char a;
short b;
int c;
long d;
double e;
};

struct test
{
char x1;
short x2;
float x3;
char x4;
};

以windows平台,microsoft编译器下:

   
由于编译器默认情况下会对斯struct作当边界(有人说“自然对界”我道边界又顺口)对合,结构的首先独成员x1,其偏移地址也0,占据了第1单字节。第二只分子x2也short类型,其开头地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的老三独成员x3和季个成员x4刚好得于那个自然边界地址及,在她前不欲分外的填写充字节。在test结构面临,成员x3要求4字节对界,是欠组织具有成员被要求的极端充分境界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占有空间吗12字节。

万一从0地址开始,首先a的k值为1,它的首地址可以假设任意位置,所以a占用第一只字节,即地址0;然后b的k值为2,他的首地址必须是2底倍数,不能够是1,所以地方1那个字节被填充,b首地址为地址2,占用地址2,3;然后至c,c的k值为4,他的首地址为4的倍数,所以首地址也4,占用地址4,5,6,7;再然后到d,d的k值也也4,所以他的首地址为8,占用地址8,9,10,11。最后到e,他的k值为8,首地方为8的倍数,所以地方12,13,14,15深受填充,他的首地址应为16,占用地址16-23。显然该大小也24。

例2

当linux平台,gcc编译器下:
只要从0地点开始,首先a的k值为1,它的首地址可以使任意位置,所以a占用第一个字节,即地址0;然后b的k值为2,他的首地址必须是2之倍数,不可知是1,所以地方1生字节被填充,b首地址为地址2,占用地址2,3;然后至c,c的k值为4,他的首地址为4底翻番,所以首地点为4,占用地址4,5,6,7;再然后到d,d的k值也也4,所以他的首地址为8,占用地址8,9,10,11。最后到e,从这里开始和microsoft的编译器开始拥有差距,他的k值为不是8,仍然是4,所以其首地址是12,占用地址12-19。显然该大小也20。

#pragma pack(1)
//让编译器对这结构作1字节对旅
struct test
{
char x1;
short x2;
float x3;
char x4;
};
#pragma pack() //取消1字节针对共同,恢复为默认4字节对一起

紧接下,看同样看押几乎近似非常之景,为了避免麻烦,不再描述内存分布,只算结构大小。

这时候sizeof(struct
test)的值为8。

首先栽:嵌套的构造

例3

struct test2
{
char f;
struct test1 g;
};

#define GNUC_PACKED
__attribute__((packed))
struct PACKED test
{
char x1;
short x2;
float x3;
char x4;
}GNUC_PACKED;

每当windows平台,microsoft编译器下:

这会儿候sizeof(struct
test)的价值仍为8。

这种情形下如管test2的亚个分子更衣起来来,研究内存分布,那么得解,test2的积极分子f占用地址0,g.a占用地址1,以后的内存分布不移,仍然满足所有骨干数据成员的首地址都也那个针对性应k的倍数这同一标准化,那么test2的大小就还是24了。但是事实上test2的大大小小也32,这是因:不克因test2的构造要改test1的内存分布状况,所以为了要test1种各个成员还满足对同的要求,f成员后面要填写一定数量的字节,(可能是windows默认的指向齐系数也8

所以struct需要从8的翻番开始储存,因为对于结构体,它的大小应该是编译器最可怜对齐模数的平头倍增))不难察觉,这个数应为7只,才会担保test1的对齐。所以test2相对于test1来说增加了8单字节,所以test2的大小也32。

其次、深入理解

以linux平台,gcc编译器下:

哟是字节对旅,为什么要对同步?
    TragicJun 发表于 2006-9-18
9:41:00现代计算机中内存空间都是按照byte划分的,从理论及讲似乎对其他类型的变量的访可以由任何地点开始,但事实上情况是在访问特定类型变量的时节时不时在特定的内存地址访问,这就是得各种类型数据据一定的条条框框以空中达到排,而非是逐一的一个接通一个底下,这就算是针对伙同。
 
 对伙同的意向及因:各个硬件平台对存储空间的拍卖达成有不行死之两样。一些阳台对某些特定项目的数据只能从一些特定地方开始存取。比如有些架构的CPU在走访一个从未展开针对性合的变量的时段会来误,那么当这种架构下编程必须管字节对齐.其他平台或没这种情形,但是最好广的凡若无遵循合那个平台要求针对数码存放进行对合,会于存取效率达带损失。比如小平台每次读都是从偶地址开始,如果一个int型(假设为32个系统)如果存放在偶地址开始之地方,那么一个诵读周期就可以读出这32bit,而而存放在奇地址开始之地方,就得2单读周期,并对准有限蹩脚读出的结果的高低字节进行拼接才能够得该32bit数额。显然以读取效率达下滑多。
二.字节本着齐对程序的震慑:

同一,这种情形下如果管test2的亚独分子更衣起来来,研究内存分布,那么可以解,test2的分子f占用地址0,g.a占用地址1,以后的内存分布不移,仍然满足所有骨干数据成员的首地址都为那个针对性应k的翻番这同一谱,那么test2的大小就还是20了。但是实际上test2的大大小小也24,同样这是因:不克因test2的构造要改test1的内存分布状况,所以为了要test1种各个成员还满足对同步的要求,f成员后面要填写一定数额的字节(估计是盖Linux的默认对齐系数为4
, 所以struct成员用打4
底翻番开始储存,因为对于结构体,它的大小应该是编译器最老对齐模数的平头倍增),不难发现,这个数目应为3独,才能够担保test1的对齐。所以test2相对于test1来说增加了4单字节,所以test2的大小也24。

 
 先让咱们看几乎单例吧(32bit,x86环境,gcc编译器):
假设结构体如下概念:
struct A
{
        int a;
        char b;
        short c;
};
struct B
{
        char b;
        int a;
        short c;
};
现都解32号机器及各种数据列的尺寸如下:
char:1(有号无符号同)   
short:2(有号子无符号同)   
int:4(有号无符号同)   
long:4(有号子无符号同)   
float:4        double:8
这就是说地方两个结构大小如何为?
结果是:
sizeof(strcut A)值为8
sizeof(struct B)的值也是12

 

组织体A中寓了4许节长度的int一个,1字节长的char一个同2字节长的short型数据一个,B也同;按理说A,B大小应该都是7字节。
故出现上面的结果是盖编译器要针对数据成员以空中及进展针对性合。上面是仍编译器的默认设置进行对旅之结果,那么我们是匪是可以变动编译器的这种默认对一头设置为,当然好.例如:
#pragma pack (2) /*点名按2字节对伙同*/
struct C
{
        char b;
        int a;
        short c;
};
#pragma pack () /*取消指定对同,恢复缺省对旅*/
sizeof(struct C)值是8。
改对齐值为1:
#pragma pack (1) /*点名按1字节针对共同*/
struct D
{
        char b;
        int a;
        short c;
};
#pragma pack () /*撤指定对一起,恢复缺省对一头*/
sizeof(struct D)值为7。
背后我们再执教#pragma pack()的作用.

 

三.编译器是以什么的尺码开展针对同之?

有关嵌套的struct的仓储仍然不知道, 待以后更改。

 先让咱们看四单主要之基本概念:

初稿地址 :  
http://www.cnblogs.com/kex1n/archive/2009/06/16/2286527.html

    1.数据类型自身之针对性齐值:
      对于char型数据,其本身对齐值也1,对于short型为2,对于int,float,double类型,其自对齐值也4,单位字节。
    2.结构体或者类的自我对齐值:其成员被我对齐值最充分之充分值。
    3.点名对齐值:#pragma pack (value)时的指定对齐值value。
   
4.数量成员、结构体和接近的行对齐值:自身对齐值和指定对齐值中小的那个值。
   
有了这些价值,我们就算好死有益于的来讨论现实数据结构的分子以及那个本身的对准齐方式。有效对齐值N是最后用来决定数据存放地点方式的值,最紧要。有效对齐N,就是表示“对同步在N上”,也就是说该数据的”存放起始地址%N=0″.而数据结构中之多少变量都是遵循定义之先后顺序来投放的。第一单数据变量的序曲地址便是数据结构的序幕地址。结构体的积极分子变量要指向共同下,结构体本身吗使依据本人之可行对齐值圆整(就是结构体成员变量占用总长度需要是针对性结构体有效对齐值的平头倍,结合下面例子理解)。这样就是未克知道地方的几乎单例证的价值了。
事例分析:
浅析例子B;
struct B
{
        char b;
        int a;
        short c;
};
借用设B从地方空间0x0000开始下。该例子中从未概念指定对齐值,在作者环境下,该值默认为4。第一单成员变量b的自己对齐值是1,比指定要默认指定对齐值4粗,所以那个行之有效对齐值为1,所以该存地址0x0000符合0x0000%1=0.次独分子变量a,其自身对齐值为4,所以中对齐值也也4,所以只能存放于开局地址也0x0004至0x0007就四单连续的字节空间被,复核0x0004%4=0,且紧依第一个变量。第三单变量c,自身对齐值也2,所以中对齐值为是2,可以存放在0x0008到0x0009立即有限单字节空间中,符合0x0008%2=0。所以从0x0000到0x0009存放的都是B内容。再看数据结构B的自己对齐值也该变量中极要命对齐值(这里是b)所以就是是4,所以结构体的实用对齐值也是4。根据结构体圆整的要求,0x0009到0x0000=10字节,(10+2)%4=0。所以0x0000A到0x000B也也结构体B所占。故B从0x0000暨0x000B共来12个字节,sizeof(structB)=12;其实如果就立即一个就算吧它既将满足字节对联合了,因为它的开局地址是0,因此一定是针对同之,之所以当后面加2单字节,是坐编译器为了落实组织数组的存取效率,试想倘若我们定义了一个结构B的一再组,那么首先只布局起始地址是0没有问题,但是第二个组织为?按照数组的概念,数组中颇具因素还是不方便临的,如果我们不把结构的尺寸上为4之整数加倍,那么下一个布局的起始地址以凡0x0000A,这明确不可知满足结构的地点指向共同了,因此我们而把组织补成中对联合大小的整数倍.其实诸如:对于char型数据,其本身对齐值为1,对于short型为2,对于int,float,double类型,其本人对齐值也4,这些都发生项目的自家对齐值也是基于数组考虑的,只是因为这些类别的长度就清楚了,所以她们之本人对齐值为就既知晓了.
同理,分析者例子C:
#pragma pack (2) /*指定按2字节针对一起*/
struct C
{
        char b;
        int a;
        short c;
};
#pragma pack () /*注销指定对一头,恢复缺省对联合*/
   
第一个变量b的自我对齐值为1,指定对齐值也2,所以,其行对齐值也1,假设C从0x0000发端,那么b存放在0x0000,符合0x0000%1=0;第二只变量,自身对齐值为4,指定对齐值也2,所以中对齐值也2,所以顺序存放在0x0002、0x0003、0x0004、0x0005季独连字节中,符合0x0002%2=0。第三单变量c的自己对齐值也2,所以中对齐值为2,顺序存放在0x0006、0x0007饱受,符合0x0006%2=0。所以从0x0000到0x00007同台八字节存的是C的变量。又C的自对齐值也4,所以C的实用对齐值也2。又8%2=0,C只占用0x0000到0x0007之八个字节。所以sizeof(struct
C)=8.

四.如何修改编译器的默认对齐值?

    1.当VC
IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的CodeGeneration选项的Struct
Member Alignment中修改,默认是8字节。
    2.每当编码时,可以如此动态修改:#pragma pack
.注意:是pragma而不是progma.

五.针对字节对旅,我们于编程中争考虑?
   
如果以编程的时段如果考虑节约空间吧,那么我们就待而结构的首地址是0,然后依次变量按照地方的准绳进行排即可,基本的准就是是管结构中之变量按照种类大小从小到大声明,尽量减少中间的互补空间.还发生同等种不畏是以以空间换取时间的效率,我们展示的开展续空间进行针对联合,比如:有同一种下空间更换时间做法是显式的插reserved成员:
             structA{
              char a;
              char reserved[3];//使用空间更换时间
              int b;
}

reserved成员对咱们的主次没有什么意义,它仅仅是从至上空间为达字节对同之目的,当然就是不加以是成员通常编译器也会见让我们机关填补对一起,我们团结加上其仅是自及显式的提拔作用.

六.字节对合可能带来的隐患:

 
代码中关于对同步的隐患,很多凡是隐式的。比如当要挟类型转换的时节。例如:
unsigned int i = 0x12345678;
unsigned char *p=NULL;
unsigned short *p1=NULL;

p=&i;
*p=0x00;
p1=(unsigned short *)(p+1);
*p1=0x0000;
说到底两句代码,从奇数边界去访问unsignedshort型变量,显然不入对旅的规定。
以x86上,类似之操作才会影响效率,但是当MIPS或者sparc上,可能就是是一个error,因为她要求得字节对齐.

七.如何查找和字节对齐方面的题目:

若果出现对共同要赋值问题首先查看
1. 编译器的big little端设置
2. 拘留这种系统自身是否支持非对齐访问
3. 要是支持看设置了对同步为,如果无则看访问时需要加某些特殊的梳洗来表明其独特访问操作

举例:

viewplain

#include <stdio.h>  

main()  {  

struct A 

{      int a; 

      char b;   

   
 short c;  };   

 struct B

 {      char b;  

       
int a;    

     
 short c;  };    #pragma pack (2) /*点名按2字节对伙同*/ 

 struct C {     

     char b;    

     int a;    

   
 short c;  };  #pragma pack () /*撤回指定对同,恢复缺省对旅*/        #pragma pack (1) /*指定按1字节本着同步*/  

struct D {  

      char b;   

      int a;    

     
short c;  };  #pragma pack ()/*撤消指定对共同,恢复缺省对一起*/    

     
 int s1=sizeof(struct A); 

   
 int s2=sizeof(struct B);  

   
 int s3=sizeof(struct C);

     
int s4=sizeof(struct D); 

 printf(“%d\n”,s1); 

 printf(“%d\n”,s2); 

 printf(“%d\n”,s3); 

 printf(“%d\n”,s4); 

 }  

输出:

8

12

8

7

 

改代码:

struct A {
   // int a;
    char b;
    short c;
};

struct B {
    char b;
   // int a;
    short c;
};

输出:

4

4

输出都是4,说明之前的int影响对合!

关押图虽懂得了1495娱乐 1

相关文章

标签:,

Your Comments

近期评论

    功能


    网站地图xml地图