Menu
0 Comments

关于sizeof运算符的详细解析

国务的sizeof运算符的瞬间解析:

Part I:根本概念和根本家用电器方法:

sizeof是C报告的一种单目轻易搬运符,另独一运算符,如C报告、–等。这批评独一功用。sizeof轻易搬运符以八位字节塑造规定了其轻易搬运数的记忆大小人。轻易搬运数可以是括在支架做成某事脸色或典型名。。轻易搬运数的记忆大小人由轻易搬运数典型决议。。 

1、用于数据典型

  sizeof家用电器塑造:sizeof(type) 

  数据典型不得不用支架括起来。。如sizeof(int)。 

2、用于变量

  sizeof家用电器塑造:sizeof(var_name)或sizeof var_name 

  不克不及将变量名括在支架中。。如sizeof (var_name),sizeof var_name等都是精确塑造。家用电器支架比拟公共用地。,集中的顺序员家用电器这种塑造。。 

  理睬:sizeof轻易搬运符不克不及用于作用典型,缺点典型或位担任守队队员。不全部典型是指具有未知记忆大小人的数据典型。,数字组典型,如未知的记忆大小人、未知目录的排列或结合典型、空典型等。 

  如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。 

  这是因汇编者正思索记录成绩。时,在排列中拔出空格以把持每个ME的地址记录。独一双典型排列的盟员,x,被得名次在独一地址是DI。。 

  6、以防轻易搬运数是数字组参量或作用典型的参量,则,sizeof规定其搀扶的大小人。

Part III、sizeof与另独一轻易搬运符的相干

  sizeof的优先为2级,比/、等3轻易搬运符的高优先。它可以与另独一运算符编队脸色。。如i*sizeof(int);在喂栩栩如生的int典型变量。

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来替代永恒值计算。

  本文次要包罗两平衡目录。,最前面的平衡是风险投资。,健康状况怎样采取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无意识或下意识行为填充物。,式记忆
把它放在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对记忆排列的特别处置的确进步了爆炸。,但时而也会引起若干打扰。,咱们还保卫变量的默许记录方法。,可以设置变量的记录方法。。

  规定在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的时机。以防你把# pragma超过 包(4)顶替#语用 包(16),很咱们就可以来24的排列面积。。

2、 sizeof用法总结

  在VC,sizeof取得很多的的用法,并且一言可尽犯若干有毛病。。下面依据sizeof后头的参量对sizeof的用法做个总结。

  A. 参量是数据典型或普通变量。。像sizeof(int),sizeof(long)附加物。需求理睬的是不同的体系或不同的的后果。。像,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家用电器在类和排列比拟于。。即使有两点值当理睬。,最前面的、排列或类的动态盟员不有影响的人,因动态变量的记忆名列前茅与ST无干。。

  以第二位、排列或类的大小人是1,无盟员变量。,因排列或类的每个例子都不得不干杯为HAV。。

  下面举例阐明:

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<
当数字的参量为PAS时,体系将作为搀扶处置。,所
//以sizeof(s)有效地为求搀扶的大小人。
return 1;
}
sizeof(func(“1234”))=4//因func的循环典型为int,因而它相当于
//求sizeof(int).

  超过为sizeof的根本用法,在实践家用电器中,要理睬辨析分派谋略,很的话可以避开若干有毛病。。 

Linux平台下测得结果顺序对上述的sizeof轻易搬运符的暂代他人职务:

#include

struct test
{
};

int 主(空)
{
struct test  ta;
printf(%d / N, sizeof(ta) );
}

用gcc汇编,出口后果是: 0。(批评下面) 1)


这亦linux平台下的独一测得结果顺序。:

#include

struct test
{
};

int 主(空)
{
using namespace std;

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

构成C 顺序用g 汇编,后果为: 1

比拟的,当将顺序修顶替类排列时,列举如下:
#include

class test
{
};

int 主(空)
{
using namespace std;

      cout << sizeof(test) ;
}
生活为:
用G,后果为: 1。

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

C 培养在Linux仪式[ ]:

一、器的原文:
1、编译程序
vi:最根本的编译程序,功用比拟弱,即使它更轻易家用电器。不需求图形接口s。
emacs:在无图形接口的假设,独一功用强大的编译程序,更难家用电器。
gedit:独一更的编译XWindow。

2、汇编者
gcc / g++:不许我绍介一下吗?

3、调试器
gdb:最根本的调试器,不需求图形接口
xxgdb:在XWindow GDB图形封装,我碎屑过

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
另独一比拟GCC汇编的C报告顺序。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注