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

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作为了求部署兵力元素的数字,如今,你必然要赚得这是错的,那

we的所有格形式必然要以任何方法找到部署兵力元素的总额?轻易的,通常有两种书写艺术办法。:
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,为什么?不难去想它。,we的所有格形式的以电话传送

效能婚配foo1工夫,顺序会在堆栈上分派3个部署兵力吗?不!部署兵力是地址,使转移者

把过来提到的地址传过来。,因而A3自然地是告发典型(char),C3的值是4。。

7. 建筑物体的sizeof
这是初学者最常问的成绩经过。,因而嗨有很多钢笔和墨汁是本质的的。。让we的所有格形式先看一眼建筑物:

struct S1
{
char c;
int i;
};
问sizeof(s1)量深深地?灵巧的你开端商讨了,char占1八位位组。,int解说为4八位位组,到这程度累积而成

必然要是5。真的这么吗?你在你的机具上查看过吗?或许你是对的。,但很可能性你错了!V

C6中默许设置的坐果是8。。
为什么?为什么我常常使挫伤?
请不要低的,we的所有格形式来好好揣摩一下sizeof的清晰度——sizeof的坐果量客体或许典型所占

内存八位位组的数字,好吧,让we的所有格形式看一眼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 表达。
先头这么,这是图例中间的八位位组表达。!东西要紧的细目呈现了。。
为什么需求八位位组表达?电脑结合规律开导we的所有格形式到这程度有助于放慢电脑的取数周转率,要不

你不得已花更多的讲授盘旋。。职此之故,编纂者将默许处置这事建筑物(实则,最高纪录转变了

同一是同样地的。,根本最高纪录典型(短,等)宽度为2谎话海报上。,让宽

4(int等)的根本最高纪录典型谎话东西可认为d的地址上。,诸如此类。到这程度,在两数字字中央

您可能性需求添加填电荷八位位组。,因而完全的建筑物体的sizeof值就增长了。
让we的所有格形式在S1中序列char和int的状态。:
struct S2
{
int i;
char c;
};
看一眼sizeof(S2)的坐果为深深地,为什么依然是8?再看一遍记着,先头的会员C依然有3个步行词

节,那是为什么?别思念这事了。,总结了以下圣职授任。

八位位组表达项目和编纂者创造,但总之,契合三项规范:
1) 建筑物变量的第东西地址可以经过它的按大小排列刊落陈言。;
2) 建筑物体每个会员相朝一个方向的建筑物体首地址的偏移量(offset)都是会员按大小排列的概数倍,如有

编纂者需求在会员当中添加填电荷八位位组(亲密的)。 添加);
3) 建筑物的总按大小排列是消瘦的概数倍。,条件有需求,编纂者将在经受住。

在东西会员随后,添加填电荷八位位组(称呼 p添加)。
朝一个方向的前述的规范,有几点需求解说。:
1) 并指责说建筑物的东西会员的地址是概数m。,你怎样再谈装支管?鉴于静止摄影一秒钟

1点的在,因而we的所有格形式话虽这样说思索会员的偏移量。,这是轻易考虑的。。想想为什么。
建筑物体某个会员相朝一个方向的建筑物体首地址的偏移量可以经过宏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的按大小排列。鉴于建筑物的会员可以是复合典型的。,比

作为另东西建筑物,到这程度,当寻觅最往国外的的根本典型的会员时,一种复合典型会员的亚段应包孕,

而指责把复合会员看法东西全部的。话虽这样说,当决定复合典型会员的偏移状态时,它是

作为全部的对待。
嗨象征的是在内的的一部分咬。,商讨稍许的难事。,让we的所有格形式着手这事判例(详细的值依然是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。
经过超过象征,we的所有格形式可以推进东西表情:
建筑物体的按大小排列量经受住东西会员的偏移量做加法其按大小排列再做加法末了的填电荷八位位组数量,即:

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值,嗨we的所有格形式要议论的是东西具有位域的建筑物。

的sizeof,它是专为其特色而列出的。。
C99选定的int、unsigned 整数和乔治英国数学家和逻辑学家可作为位域典型,话虽这样说编纂者先前连续的一节时间了差不多极度的的编纂者。,允

静止典型的在。
运用位的首要决意是紧缩记着力。,它的普通圣职授任是:
1) 条件接场地场地的典型同样的,且其位宽积和决不典型的sizeof按大小排列,前面的场地将是

在前东西场地的邻接,直到它不克不及控制;
2) 条件接场地场地的典型同样的,但其位宽积和大于典型的sizeof按大小排列,前面的场地将是

重新的记着力单元开端,它的偏移量是其典型的概数倍。;
3) 条件接场地场地的典型差别,编纂者的详细创造是差别的。,VC6以紧缩的方法

,Dev-C 以紧缩办法;
4) 条件场地场地与非域场地一齐驱散。,它不紧缩。;
5) 完全的建筑物的总按大小排列是按大小排列的概数倍。。

让we的所有格形式着手这事判例。。
示例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/1552.html
上一篇:上一篇:聚智堂官方回应:“聚智堂事件”有背后黑手 _搜狐教育
下一篇:下一篇:没有了

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