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

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/1555.html
上一篇:上一篇:sizeof进行结构体大小的判断
下一篇:下一篇:没有了

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