您的位置:主页 > 吐槽专区 > 综合新闻

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

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