您的位置:主页 > 新闻赛事 > 综合新闻

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/xwss/1550.html
上一篇:上一篇:唐诗宋词选读 唐诗教案全集.doc
下一篇:下一篇:没有了

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