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

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
因它在喂贮存器地址,过后,自然地,它使相当乳房地址汽车的宽度。。因而在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使明确的变量,它的贮存器打孔的第任一地址需求除号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。想任一不

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

空体系的变量也必须做的事贮存器。,同一编纂者也就唯一的为其分派任一八位位组的打孔用于占位了。

列举如下:
struct S5 { };
sizeof( S5 ); // 果实是1。

8. 含位域体系体的sizeof
先前大人物说过。,位域盟员不克不及独自被取sizeof值,喂敝要议论的是任一具有位域的体系。

的sizeof,它是专为其特相当而列出的。。
C99装设int、unsigned 整数和乔治英国数学家和逻辑学家可作为位域典型,只因为编纂者早已给予了险乎缠住的编纂者。,允

对立的事物典型的在。
运用位的首要宾格的是紧缩贮存器。,它的普通圣职授任是:
1) 设想使结合接守接守的典型同样的人,且其位宽积和不足典型的sizeof大量,前面的接守将是

在前任一接守的副的,直到它不克不及接受;
2) 设想使结合接守接守的典型同样的人,但其位宽积和大于典型的sizeof大量,前面的接守将是

重复的贮存器单元开端,它的偏移量是其典型的完整的倍。;
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/1556.html
上一篇:上一篇:sizeof进行结构体大小的判断
下一篇:下一篇:没有了

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