总结sizeof 的问题

sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。这是一个依赖于编译系统的值。

1.      sizeof(int);       
2.	sizeof(double);     
3.	sizeof(char);     
4.	sizeof(bool);       // = 1    
5.	sizeof(short);      //2
6.	sizeof(float);      // = 4    
7.	sizeof(long);       // = 4   

2   数组sizeof 不会蜕化为指针 ,但是如果数组作为函数的形参,数组名即为指针

 char a1[] = "abc";   sizeof( a1 );  3*sizeof(char)
int a2[3];          sizeof( a2 ); // 结果为3*sizeof(int)=12(依赖于int)
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
sizeof(foo);//error
voidfoo2(){}
sizeof(foo2());//error
int a[];
int foo(a[]) //sizeof(a)==4



 

charaa[10];cout<<strlen(aa)<<endl; //结果是不定的,因为未初始化,'\0'在内存中的位置不确定

sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

3 平时默认对齐是8
#pragmapack(push)//将当前pack设置压栈保存
#pragmapack(2)//必须在结构体定义之前使用
structS1{charc;inti;};   //6
structS3{charc1;S1s;charc2;}; //10
#pragmapack(pop)//恢复先前的pack 设置
空结构体,空类,sizeof 都为1 单继承和多继承的空类所占内存都是1 但是虚继承涉及虚表(虚指针)都是4

4
structBF3{charf1:3;charf2;charf3:5;};

C99规定int、unsigned int和bool可以作为 位域类型,但 编译器几乎都对此作了扩展,允许其它类型类型的存在。使用 位域的主要目的是压缩存储,其大致规则为:
1 ) 如果相邻 位域 字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
structBF1{charf1:3;charf2:4;charf3:5;}//2
2) 如果相邻 位域 字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的 存储单元 开始,其 偏移量 为其类型大小的整数倍
位域 字段穿插在其中,不会产生压缩
4) 如果 位域 字段之间穿插着非位域字段,则不进行压缩;
structBF3{charf1:3;charf2;charf3:5;}; //3
5) 整个 结构体的总大小为最宽基本类型成员大小的整数倍。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值