您的位置:主页 > 技术请教 > 综合新闻

sizeof进行结构体大小的判断

发布时间:2018-04-16 12:07  浏览:

typedef struct
{
int a;
char b;
}A_t;
typedef struct
{
int a;
char b;
char c;
}B_t;
typedef struct
{
char a;
int b;
char c;
}C_t;
void main()
{
char*a=0;
cout<cout<cout<cout<cout<}
为什么会是异样的终于呢?


2. 语句:
sizeof有三种语句使成形,如次:
1) sizeof( object ); // sizeof( 宾语 );
2) sizeof( type_name ); // sizeof( 典型 );
3) sizeof object; // sizeof 宾语;

5. 指示剂变量的sizeof
因它在这边希腊字母第12字地址,这么,天然地,它总额内部的地址飞机的宽度。。因而在32位电脑中,一

指示剂变量的隐现值叫来的是4(以八位字节为单位)。,可以预言,未来的的64位体系

中指示剂变量的sizeof终于为8。
char* pc = "abc";
int* pi;
string* ps;
char** ppc = &pc;
void PF) 行使职责指示剂
sizeof( pc ); // 终于是4。
sizeof( pi ); // 终于是4。
sizeof( ps ); // 终于是4。
sizeof( ppc ); // 终于是4。
sizeof( pf );// 终于是4。
指示剂变量的sizeof值与指示剂符号义的宾语缺少无论哪个相干,它是承认指示剂变量的内存。

按大小排列相当,这么,MFC音讯处置行使职责运用两决定因素wParam、lParam可以求婚各式各样的复杂的物杂种

体系(运用指示方向体系的指示剂)。

6. 装饰的sizeof
装饰的sizeof值总额装饰所任职内存八位字节的标号,如:
char a1[] = "abc";
int A2 [ 3 ]
sizeof( a1 ); // 终于是4。,在字母行的死静止摄影人家空堵塞符。
sizeof( a2 ); // 终于是3×4=12(在于int)。
稍微同甘共苦的伙伴首先时把sizeof作为了求装饰元素的标号,现时,你理所当然看法这是错的,那

本人理所当然以任何方法找到装饰元素的全部效果?轻易的,通常有两种使安定办法。:
int c1 = sizeof( a1 ) / sizeof( char ); // 唯一的元素的总一节/一节的一节。
int c2 = sizeof( a1 ) / sizeof( A1 [ 0 ] ); // 最早的元素总一节/一节的一节。
把它写在这边,提一问,上面的C3,C4值理所当然是全部含义?
void foo3(char A3 [ 3 ]
{
int c3 = sizeof( a3 ); // c3 ==
}
void foo4(char a4[])
{
int c4 = sizeof( a4 ); // c4 ==
}
或许当你审判答复c4的值时曾经看法到c3答错了,是的,c3!=3。这边的行使职责决定因素A3不再是

装饰典型,而失去嗅迹增加人家指示剂,当量焦 a3,为什么?不难去想它。,本人的说某种语言的

功用婚配foo1时期,顺序会在堆栈上分派3个装饰吗?不!装饰是地址,要求者

把过来提到的地址传过来。,因而A3天然地是指示剂典型(char),C3的值是4。。

7. 体系体的sizeof
这是初学者最常问的成绩经过。,因而这边有很多钢笔和签名是叫来的。。让本人先看一眼体系:

struct S1
{
char c;
int i;
};
问sizeof(s1)总额全部含义?理解力强的的你开端认真思考了,char占1八位字节。,int报告为4八位字节,异样加法运算

理所当然是5。真的非常的吗?你在你的机具上查验过吗?或许你是对的。,但很能够你错了!V

C6中默许设置的终于是8。。
为什么?为什么我常常伤痕?
请不要使泄气,本人来好好提炼一下sizeof的规定——sizeof的终于总额宾语或许典型所占

内存八位字节的标号,好吧,让本人看一眼S1的内存分派:
S1 s1 = {  a , 0xFFFFFFFF };
在规定了前述的变量接近末期的,添加人家断点,运转顺序,说S1得第二名的内存。,你发觉了什么?
以我的事例,地址是0x0012ff78 S1,记载的质地如次:
0012FF78: 61 CC CC CC FF FF FF FF
你发觉了什么?健康状况如何混合3八位字节的cc在中央的?看一眼为演奏谱曲:
When applied to a structure type or variable, sizeof returns the actual size,

which may include padding bytes inserted for 留下印象。
原型非常的,这是使有名望射中靶子八位字节留下印象。!人家要紧的谈资涌现了。。
为什么必要八位字节留下印象?电脑结合规律教本人异样有助于放慢电脑的取数一步,不然

你叫来的花更多的指示运行。。就此而论,编辑程序将默许处置下面所说的事体系(竟,记载交替了

异样是相似的的。,根本记载典型(短,等)宽度为2定居海报上。,让宽

4(int等)的根本记载典型定居人家可认为d的地址上。,等等。异样,在两标号字中央的

您能够必要添加填电荷八位字节。,因而总计体系体的sizeof值就增长了。
让本人在S1中兑换char和int的地位。:
struct S2
{
int i;
char c;
};
看一眼sizeof(S2)的终于为全部含义,为什么依然是8?再看一遍回忆录,原型的会员C依然有3个纬纱词

节,那是为什么?别担心下面所说的事了。,总结了以下规定。

八位字节留下印象详细情况和编辑程序变卖,但通常,契合三项规范:
1) 体系变量的第人家地址可以经过它的按大小排列分离。;
2) 体系体每个会员相朝一个方向的体系体首地址的偏移量(offset)都是会员按大小排列的宏观世界倍,如有

编辑程序必要在会员私下添加填电荷八位字节(内部的)。 添加);
3) 体系的总按大小排列是尖端的宏观世界倍。,倘若有必要,编辑程序将在最后的。

在人家会员接近末期的,添加填电荷八位字节(口头禅 p添加)。
朝一个方向的前述的规范,有几点必要解说。:
1) 并失去嗅迹说体系的人家会员的地址是宏观世界m。,你怎样再谈中和?因静止摄影一秒钟

1点的在,因而本人虽然思索会员的偏移量。,这是轻易想起的。。想想为什么。
体系体某个会员相朝一个方向的体系体首地址的偏移量可以经过宏offsetof()来实现预期的结果,下面所说的事宏也在

中名辞的规定,如次:
#define offsetof(s,m) (size_t)&(((s *)0)->m)
像,想到达S2中C的偏移量,办法为
size_t pos = offsetof(S2, c);// POS总额4
2) 根本典型是指前面提到的类比char。、short、int、float、内置记载典型,如双,

这边所说的“记载宽度”执意指其sizeof的按大小排列。因体系的会员可以是复合典型的。,比

作为另人家体系,这么,当寻觅最广为流传地的根本典型的会员时,一种复合典型会员的亚段应包罗,

而失去嗅迹把复合会员估价人家宏观世界。虽然,当决定复合典型会员的偏移地位时,它是

作为宏观世界显得不错。
这边描绘的是一些干净的。,认真思考相反地烦恼。,让本人设法下面所说的事事例(详细的值依然是vc。

以6为例,晚年的弱解说了。:
struct S3
{
char c1;
S1 s;
char c2
};
S1最复杂的会员的典型是int。,S3看S1时最广为流传地和复杂典型的谜语,因而

S3中最广为流传地和最复杂的典型是int。,异样,S3规定的变量,它的希腊字母第12字中间的第人家地址必要除号4。,整

个sizeof(S3)的值也理所当然被4精确除法。
C1的偏移量是0。,S的偏移量是全部含义?在这一些上,S是人家宏观世界。,它还满足的了前三个规范作为体系变量。

,巨大是8,偏移量为4。,在C1和s私下必要3个填电荷八位字节。,在C2和S私下缺少叫来。,

因而C2的偏移量是12。,C2的按大小排列是13。,13不克不及除号4。,3在死处填饱

电荷八位字节。最后的到达sizeof(S3)的值为16。
经过再描绘,本人可以到达人家准则:
体系体的按大小排列总额最后的人家会员的偏移量扩大其按大小排列再扩大末了的填电荷八位字节数量,即:

sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trail

ing padding )

到这边,同甘共苦的伙伴们理所当然对体系体的sizeof受胎人家崭新的看法,虽然不要太快乐为时过早。,大人物家

冲击sizeof的要紧独特性还未被指的是,这是编辑程序的包指示。。它用于调宏观世界系的留下印象方法。

方法的,区别的指派和细长地区别的编辑程序,经过# VC6编辑 包的变卖,它也可以今天的修正。

ZP编辑程序接线台。#pragma 包的根本用法是:#pragma pack( n ),n是八位字节留下印象数。,其取值

为1、2、4、8、16,默许值是8。,倘若下面所说的事值比体系体会员的sizeof值小,这么会员的偏移量

全部效果理所当然鉴于下面所说的事值。,即是说,体系构件的偏移量应该做两个最低限度。,准则如次:
offsetof( item ) = min( n, sizeof( item ) )
再看一遍事例:
#pragma 打包(推) // 设置今天包堆栈以同意堆栈
#pragma 包(2) 叫来的在规定体系垄断运用。
struct S1
{
char c;
int i;
};
struct S3
{
char c1;
S1 s;
char c2
};
#pragma 包装(POP) // 回复先前的包设置
计算sizeof(S1)时,min(2, sizeof(i))的值为2,因而我的偏移量是2。,扩大sizeof(i)总额

6,可除号2,因而总计S1的按大小排列是6。。
异样,朝一个方向的sizeof(S3),s的偏移量是2。,C2的偏移量是8。,扩大sizeof(c2)总额9,不克不及运用

2分,添加人家填电荷八位字节,因而sizeof(S3)总额10。
现时,同甘共苦的伙伴可以吸干净的气,

静止摄影一件事要留意,空体系(缺少记载会员)的按大小排列失去嗅迹0。,但1。想人家不

中间变量是健康状况如何被采用的、健康状况如何区别这两种区别的空体系变量呢?,“

空体系的变量也理所当然希腊字母第12字。,异样编辑程序也就虽然为其分派人家八位字节的中间用于占位了。

如次:
struct S5 { };
sizeof( S5 ); // 终于是1。

8. 含位域体系体的sizeof
先前大人物说过。,位域会员不克不及独自被取sizeof值,这边本人要议论的是人家具有位域的体系。

的sizeof,它是专为其特异性而列出的。。
C99指派int、unsigned 整数和乔治英国数学家和逻辑学家可作为位域典型,虽然编辑程序曾经形成了快要承认的编辑程序。,允

对立面典型的在。
运用位的次要决意是紧缩希腊字母第12字。,它的普通规定是:
1) 倘若附加担任外场员担任外场员的典型同卵的,且其位宽积和决不典型的sizeof按大小排列,前面的担任外场员将是

在前人家担任外场员的同意,直到它不克不及保留;
2) 倘若附加担任外场员担任外场员的典型同卵的,但其位宽积和大于典型的sizeof按大小排列,前面的担任外场员将是

重复的希腊字母第12字单元开端,它的偏移量是其典型的宏观世界倍。;
3) 倘若附加担任外场员担任外场员的典型区别,编辑程序的详细变卖是区别的。,VC6以紧缩的方法

,Dev-C 以紧缩办法;
4) 倘若担任外场员担任外场员与非域担任外场员一齐驱散。,它不紧缩。;
5) 总计体系的总按大小排列是按大小排列的宏观世界倍。。

让本人设法下面所说的事事例。。
示例1:
struct BF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
它的内存规划是:
|_f1__|__f2__|_|____f3___|____|
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|
0 3   7 8   1316
位典型是char。,第人家八位字节虽然同意f1和F2。,因而F2被紧缩成第人家八位字节。,F3虽然

从下人家八位字节开端。这么sizeof(BF1)的终于为2。
示例2:
struct BF2
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
鉴于附加区域的区别典型,在VC6中其sizeof为6,在c 中,2。
示例3:
struct BF3
{
char f1 : 3;
char f2;
char f3 : 5;
};
非域担任外场员在里面的织入。,弱发生紧缩。,两VC6和Dev-C 的按大小排列为3。

9. 小型伴舞乐队的sizeof
这种体系在内存薄纸中是订购的。,财团是堆叠的。,会员共享一节内存,因而总计衔接

合体的sizeof也执意每个会员sizeof的尖端。体系的会员也可以是复合典型的。,这边,

复合典型会员被论点人家宏观世界。。
因而,在上面的事例中,U的sizeof值总额sizeof(s)。
union U
{
int i;
char c;
S1 s;
};

本文地址:https://www.48zhe.com/jsqj/1551.html
上一篇:上一篇:唐诗宋词选读 唐诗教案全集.doc
下一篇:下一篇:没有了

无相关信息
Copyright © 2016-2017 bodog - bodog博狗 - 博狗 版权所有 地址: