求购信息

关于sizeof运算符的详细解析

作者:admin 2018-03-18 我要评论

...

情况sizeof运算符的备忘录解析:

Part I:专心致志的根本概念和根本方法:

sizeof是C语风的一种单目巧妙地把持符,如此et cetera运算符,如C语风、--等。这过错本人功用。sizeof巧妙地把持符以八位位组使适合支付了其巧妙地把持数的贮藏上浆。巧妙地把持数可以是本人脸色或括在支架内的典型名。贮藏上浆是由巧妙地把持数的巧妙地把持数的典型决定。 

1、数据典型

  sizeof专心致志使适合:sizeof(type) 

  数据典型麝香括在支架中。如sizeof(int)。 

2、变量

  sizeof专心致志使适合:sizeof(var_name)或sizeof var_name 

  不克不及将变量名括在支架中。。如sizeof (var_name),sizeof var_name等都是很使适合。专心致志支架喻为平民。,集中顺序员专心致志这种使适合。 

  理睬:sizeof巧妙地把持符不克不及用于重大聚会典型,只有雄蕊或雌蕊的典型或土地。只有雄蕊或雌蕊的典型指具有未知贮藏上浆的数据典型,假设限制典型未知,内存上浆、未知满意的的作曲或结盟典型、void典型等。 

  如sizeof(max)若此刻变量max精确地解说为int max(),  sizeof(char_v) 若此刻char_v精确地解说为char char_v [MAX]且MAX未知,sizeof(void)都过错很使适合。 

Part II:sizeof运算能够的发生:

sizeof巧妙地把持符的发生典型是size_t,大约在这种典型是unsigned int典型的头贴纸。这类典当的最大瞄准获得的八位位组上浆。 

  1、假设巧妙地把持数具有char典型、unsigned char或signed char,发生是1。。 

  ANSI C正式规则特点典型是1八位位组。。 

  2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double典型的sizeof 在ANSI C中不注意详细规则,上浆宁静赚得,概括地说,能够是2。、2、2、2、 4、4、4、8、10。 

以我的32位机具Linux平台为例:
int 为 4 byte;
unsigned int为 4byte;
short int 为 2byte;
unsigned short :  2
long int :  4
unsigned long : 4
float : 4
double : 8
long double : 12

  3、当巧妙地把持数是协助时,sizeof依赖于编纂者。譬如,在微软的C / C,类协助协助的八位位组数是2。,far、宏大的类协助八位位组数为4。协助八位位组普通UNIX的号码是4。 

  4、当巧妙地把持数具有限制典型时。,发生是限制的八位位组总额。。 

  5、结盟典型巧妙地把持数的sizeof是其最大八位位组会员的八位位组数。作曲典型巧妙地把持数的sizeof是这种典型瞄准的总八位位组数,包罗什么都可以替换,。 

  让我们家看一眼下面的作曲: 

  struct {char b; double x;} a; 

  在一点点机具上sizeof(a)=12,而普通sizeof(char)+ sizeof(double)=9。 

  这是因编纂者是思索队列成绩时,经过在把持会员瞄准中拔出空白来处置队列作曲。。本人会员的双分子层式作曲,X,是性伙伴在本人地址,迪。 

  6、假设巧妙地把持数是限制参量或重大聚会典型的参量,则,sizeof支付其协助的上浆。

Part III、sizeof与如此et cetera巧妙地把持符的相干

  sizeof的先为2级,比/、等3巧妙地把持符的高先。它可以与如此et cetera运算符长脸色。。如i*sizeof(int);Where I is a int type variable。

Part IV、sizeof的次要用途

1、sizeof巧妙地把持符的本人次要用途是与贮藏分派和I/O零碎那么的例程举行一致。譬如: 

  void *malloc(size_t size), 

  size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 

2、sizeof的另本人的次要用途是计算限制中元素的总计。譬如: 

  void * memset(void * s,int c,sizeof(s))。

Part V、理睬的提议和专心致志

  巧妙地把持数的八位位组数在赚得时能够会替换。,提议在归结起来巧妙地把持数八位位组上浆时用sizeof来替代永恒的计算。

  本文次要包罗两一部分满意的。,最初一部分次要对VC,以任何方法采取sizeof来求作曲的上浆,不浓的呈现的成绩,并支付了本人处置成绩的方法,第二份食物一部分总卖空的人VC中sizeof的次要用法。

1、 sizeof专心致志在作曲上的事件

  请看下面的作曲:

struct MyStruct
{
double dda1;
char dda;
int type
};

  对作曲MyStruct采取sizeof会呈现什么发生呢?sizeof(MyStruct)为有点呢?或许你会这么样求:

sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13

  但在vc超过的勘探时,你会被发现的人sizeof(MyStruct)为16。你认识为什么VC会到达这么样本人发生?

  说起来,这是一种特别的vc变量贮藏处置方法。。为了增多cpu的贮藏攻击:严厉批评或猛烈攻击,VC对少数变量的获得学位地址队列处置。在默许事件下,VC规则各会员变量沉淀的获得学位地址对立于作曲的获得学位地址的偏移量麝香为该变量的典型所任职的八位位组数的总是。下面列出了平民的队列典型(bit零碎)。

  典型
队列(变量贮藏对立的获得学位地址的偏移量)

  Char
偏移量麝香为sizeof(char)即1的总是

  int
偏移量麝香为sizeof(int)即4的总是

  float
偏移量麝香为sizeof(float)即4的总是

  double
偏移量麝香为sizeof(double)即8的总是

  Short
偏移量麝香为sizeof(short)即2的总是

  每个会员变量由于按次由于按次专心致志围绕。,同时,由于下面的队列方法整洁的态度。,空八位位组VC将主动填充物。。同时VC为了确保作曲的上浆为作曲的八位位组管制数(即该作曲中任职最大围绕的典型所任职的八位位组数)的总是,因而在为不可更改的本人会员变量专心致志围绕过后,八位位组也会由于必要主动填充物。。

  下面的示例用来阐明VC健康状况如何贮藏作曲。

struct MyStruct
{
double dda1;
char dda;
int type
};

  当围绕分派给前述的作曲时,由于会员变量的按次和VC队列,先分派围绕为第本人会员dDA1,它的获得学位地址与作曲的初始地址同上。 仅仅为sizeof(double)的总是),会员变量任职sizeof(double)=8个八位位组;接下来,为第二份食物个会员分派围绕,此刻,地址的下本人地址是,是sizeof(char)的总是,去,DDA铺子适合8个本地的的偏移量。,会员变量任职 sizeof(char)=1个八位位组;该典型的围绕散布第三个会员,在地址的获得学位地址的下本人职责或工作的这段时期,过错sizeof (int)= 4比,为了充分发挥潜在的能力摆脱掉约束成绩,VC主动填充物3八位位组(三八位位组不放什么都可以东西)。,此刻,地址的下本人地址是,仅仅是sizeof(int)= 4比,去,在偏移量为12的本地的贮藏典型。,会员变量任职sizeof(int)=4个八位位组;此刻,完整的作曲的会员变量先前分派给SP。,常规任职围绕的上浆:8+1+3+4=16,仅仅为作曲的八位位组管制数(即作曲中任职最大围绕的典型所任职的八位位组数sizeof(double)=8)的总是,因而不注意排泄来填充物八位位组。。因而完整的作曲的要紧是:sizeof(MyStruct)=8+1+ 3+4=16,有3个八位位组是由VC主动填充物的。,不注意什么意思。。

  另本人样板列举如下,互换里的会员变量的态度上,让它下面的:

struct MyStruct
{
char dda;
double dda1;
int type
};

  围绕的作曲被尽能够多的仪式吗?,可以买到sizeof(MyStruc)为24。下面提到的少数教义是围绕分派的结成。,前述的VC散布的围绕作曲剖析是什么?。(复杂的解说)

struct MyStruct
{
char DDA;/偏移量0,充分发挥潜在的能力队列,DDA任职1八位位组;
double dDA1;/下本人可购得的地址偏移1,过错sizeof(double)=8
//的总是,7个八位位组必要为了替换偏移8。
的方法),因而VC会主动填充物7八位位组。,dDA1贮藏在偏移8
在地址,它任职8八位位组。。
int type;鄙人本人可购得的的16的偏移地址,是sizeof(int)=4的倍
//数,充分发挥潜在的能力int的队列方法,因而不必要VC主动填充物。,type存
在偏移量16中。,它必要4个八位位组。
};有会员变量分派围绕,总围绕上浆是1 7 8 4 = 20,不注意作曲
//的节管制数(即作曲中任职最大围绕的典型所任职的八位位组数sizeof
多(双)= 8),我们家必要填充物4个八位位组,为了充分发挥潜在的能力作曲要紧
//sizeof(double)=8的总是。

  去,作曲的上浆:sizeof(MyStruc)为1+7+8+4+4=24。常规7 4 = 11八位位组VC主动填充物。,不注意什么意思。。

  鉴于VC 的贮藏作曲特别处置是增多CPU的贮藏,但偶然也产额少数烦扰。,我们家也放映变量的默许队列方法,可以设置变量的队列方法。。

  VC供奉#语用 组(n)设置变量n八位位组队列。n八位位组队列刻薄的对初始偏移两例:最初、假设n是大于或合计所任职的八位位组数变量的,而且偏移量麝香充分发挥潜在的能力默许队列。,第二份食物、假设n以内该变量典型所任职的八位位组数,而且偏移量是n的总是。,不充分发挥潜在的能力默许队列方法。。对作曲的总上浆也有约束。,以下两个窥测:假设n大于有会员变量典型所任职的八位位组数,去,作曲的总上浆麝香是围绕数的总是。;

  要不,氮的总共要多。下面是少数样板它的用法。。

#pragma 打包(推) 防护用品使结盟情况
#pragma 包(4)/设置为4八位位组队列
struct test
{
char m1;
double m4;
int m3;
};
#pragma 打包(POP)/回复队列

  前述的作曲的要紧为16。,下面的贮藏事件剖析,M1的第本人围绕分派,它的偏移量是0。,充分发挥潜在的能力我们家本身的设置队列(4八位位组队列),M1任职1八位位组。。而且开端为M4分派围绕,此刻偏移量为1。,3八位位组必要重新装满,这么样使偏移量充分发挥潜在的能力为n=4的总是(因sizeof(double)大于n),M4任职8八位位组。而且为M3分派围绕,此刻偏移量为1。2,获得4的总是,M3任职4个八位位组。现时一些会员变量分派围绕,该16个八位位组的散布,充分发挥潜在的能力n的总是。假设超过#语用 包(4)反倒#语用 包(16),因而我们家可以买到作曲的上浆是24。。

2、 sizeof用法总结

  在VC,sizeof必须很多地的用法,悠闲地犯少数误会。下面由于sizeof前面的参量对sizeof的用法做个总结。

  A. 数据典型的参量或作为普通变量。譬如sizeof(int),sizeof(long)et cetera。必要理睬的是,从差额的零碎或差额的发生要紧。譬如,int典型是16位零碎达到目标2个八位位组。,32零碎达到目标4八位位组。

  B. 就限制或协助参量。下面是少数样板。

int [ 50 ] //sizeof(a)=4*50=200; 就限制上浆的围绕
int *a=new int [ 50 ] sizeof(a)=4; a是协助,sizeof(a)是求协助
//的上浆,在32位零碎中,自然,它的4个八位位组。。

  C. 参量是作曲或类。sizeof专心致志在类和作曲同上。。但有两点值当理睬。,最初、作曲或许类达到目标静力学会员不合错误作曲或许类的上浆发生感情,因静力学变量的贮藏态度和作曲或类孤独。

  第二份食物、不注意作曲会员变量或类上浆为1。,因麝香典当类或作曲的每个包围具有鞋底性。

  下面是少数样板:

Class Test{int 一;静力学 double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s是协助。
Class test1{ };//sizeof(test1)=1;

  D. 其它参量。下面是少数样板。
int func(char s[5]);
{
cout<
参量去世处置零碎的总共为本人协助,所
//以sizeof(s)事实上的为求协助的上浆。
return 1;
}
sizeof(func(“1234”))=4//因func的送还典型为int,因而,相当于
//求sizeof(int).

  超过为sizeof的根本用法,在实践专心致志中,要理睬剖析分派战略,这么样的话可以幸免少数误会。。 

Linux平台下勘探顺序对前述的sizeof巧妙地把持符的重新装满:

#include

struct test
{
};

int 次要(void)
{
struct test  ta;
printf(%d / N, sizeof(ta) );
}

用gcc编制,的输入: 0。(相反的 1)


在Linux平台下的勘探顺序:

#include

struct test
{
};

int 次要(void)
{
using namespace std;

      struct test  ta;
cout << sizeof(struct test) ;
}

作曲C 顺序用g 编制,发生为: 1

同类的的,修正类作曲的顺序,列举如下:
#include

class test
{
};

int 次要(void)
{
using namespace std;

      cout << sizeof(test) ;
}
防护用品为:
专心致志c 编纂者,发生为: 1。

推论: C 顺序或顺序设置为1,C顺序GCC编纂者设置为0。。

] [ Linux仪式下的C 课程:

一、器的课文:
1、校订者
vi:最根本的校订者,功用喻为弱,但它是更轻易专心致志。不必要图形接口s。
emacs:在不注意图形接口的先决条件的,本人功用强大的校订者,更难专心致志。
gedit:本人上进的校订者XWindow。

2、编纂者
gcc / g++:我不注意绍介过吗?

3、调试器
gdb:最根本的调试器,不必要图形接口
xxgdb:GDB XWindow图形包,我不专心致志它

4、交流做
Glade

5、集成器
Eclipse + CDT:专心致志过错上等的。,但这是本人C 集成研制仪式。。
Kylix:碎屑过,这是说,它也可以被用来研制C 顺序。
KDevelope:上进的集成研制仪式,鉴于KDE。

我用的是KDevelope现时,在专心致志gedit + gcc或许Eclipse + CDT。

二、课程的初学者
在Linux 伸开的C 顺序可以以下: .C,  .cc,  .cpp。
提议和Windows平台 .cpp 为延伸。

Fedora Core 5版本的G 版本 ;2006年,应适合ISO C++ 2003规范。
编制命令: g++ **.cpp
如此et cetera同类的的GCC编制的C语风顺序。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 关于sizeof运算符的详细解析

    关于sizeof运算符的详细解析

  • 《上海市居住证申办实施细则

    《上海市居住证申办实施细则

  • 北京市西城区民政局

    北京市西城区民政局

  • 【初中作文】感动就在身边1

    【初中作文】感动就在身边1