- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
sizeof 九点用法
Sizeof 用法详解
一、sizeof三种语法: 返回的是size_t类型(typedef unsigned int size_t)
1、sizeof(object) //sizeof(对象)
2、sizeof(type_name)// sizeof(类型)
3、sizeof object //sizeof 对象 ?--因为sizeof是操作符不是函数
例如:
int i;
sizeof(i)
sizeof(int)
sizeof int ? x---此时应该用对象
sizeof i ? ??
二、sizeof计算对象大小最终也是转换成对对象类型的计算
sizeof(2)==sizeof(int)
sizeof(2+3.14)==sizeof(double)
c99标准:sizeof也可以对一个函数调用求值,其结果是函数返回类型大小,函数并不会被调用
sizeof计算出现在编译时刻,所以可以当做常量表达式使用
三、指针变量的sizeof
指针变量的sizeof值与指针所指对象没有任何关系,在32位系统中指针大小为4字节,在64位系统中指针大小为8字节
例如char* pc = abcdefg
sizeof(pc) --- 4
注:可以用strlen(pc)来计算字符串长度
四、数组的sizeof
数组的sizeof值等于数组所占内存字节数
例如:
a)char a1[]=abcd sizeof(a1)---5 (末尾还有一个null终止符)
b)int a2[3] --sizeof(a2)---3*4=12 ?依赖于int占多少个字节
c)void foo(char a3[3]){int num = sizeof(a3);---num=4}
注意:这里并不是求数组的元素个数,元素个数求法如下:
int c1 = sizeof(a1)/sizeof(char)
五、结构体的sizeof
这里要考虑内存对齐,在计算机原理里面讲过内存对齐有助于取数速度,因为有的cpu取地址从偶地址开始取。结构体在内存中也需要内存对齐
结构体对齐准则
a)结构体首地址必须能够被其最宽的基本类型成员大小所整除
b)结构体的总大小为结构体最宽基本数据类型成员大小的整数倍,如有需要编译器会进行填充字节
c)结构体中每个成员相对于结构体首地址偏移量都是成员大小的整数倍
例:
struct S1
{
?? ? char c;//偏移量为0
?? ? char d;//偏移量为1 刚好为char的一倍
?? ? int i;//偏移量应该为4,但是前面两个总的大小为2,所以必须在d后面填充2个字节的大小
}
sizeof(S1)=1+1+2+4 = 8而不是1+1+4=6
分析:首先最宽基本数据类型是int 大小为4,所以i偏移量应该为4的倍数,即在c后面必须要填充3个字节,总大小为8
struct S2
{
?? ? char c1;
?? ? S1 s;
?? ? char c2;
}
当结构体中包含另一个复合类型时,不能将复合类型看做一个整体而是将它拆开看子成员,这里s中int是最宽的,所以S2最宽的也是int 大小为4
struct S3{}
空结构体 sizeof为1
六、编译器的pack指令
#pragma pack(n),n为字节对齐模数,其取值为1 2 ?4 8 16 默认为8,如果n比结构体中最宽基本数据类型大小还要小,则以n为对齐模数,否则以最宽为对齐模数,即取两者中最小的
?#pragma pack(2) // 必须在结构体定义之前使用
struct S4 { char c; int i; }; ---6字节
#pragma pack(1)
?? ? struct bs???? {????????? char a;????????? char b;????????? char c;????????? char f;????????? char e;????????? short d;???? }xx; ---sizeof 为7
七、strlen与sizeof区别
a)strlen(char* )计算的是字符串实际长度,它的求法是从开始到遇到第一个‘\0’为止
而sizeof是指所占的内存数
b)sizeof 可以用类型做参数,但是strlen只能以char*做参数 且必须是以\0结尾
c)sizeof参数不退化,传递给strlen就退化为指针了
d)sizeof是在编译时计算,而strlen是在运行时计算,是计算字符串长度,而不是占用内存空间大小
?
八、含位域结构体的sizeof
位域成员不能单独被取sizeof值,所以讨论的是含有位域的结构体的sizeof
准则:
a)如果相邻位域字段的类
文档评论(0)