您的位置:主页 > 模板教学 > 综合新闻

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) 框架体每个分子相助动词=have框架体首地址的偏移量(offset)都是分子变得越来越大的必须的倍,如有

编纂者必要在分子中间添加填电荷八位字节(里面的)。 添加);
3) 框架的总变得越来越大是最高值的必须的倍。,假使有必要,编纂者将在基本原理。

在任何人分子过后,添加填电荷八位字节(附属物 p添加)。
助动词=have前述的规范,有几点必要解说。:
1) 并指责说框架的任何人分子的地址是必须的m。,你怎地再谈出发?鉴于也一秒钟

1点的在,因而咱们最适当的思索分子的偏移量。,这是轻易出现的。。想想为什么。
框架体某个分子相助动词=have框架体首地址的偏移量可以经过宏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。。
同一,助动词=havesizeof(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/mbjx/1553.html
上一篇:上一篇:sizeof进行结构体大小的判断
下一篇:下一篇:没有了

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