sizeof相关系列问题

1.有关int,short,long,float,double,char等取sizeof问题:一般来说

sizeof(int) = 4;

sizeof(short) = 2;

sizeof(long) = 4;

sizeof(char) = 1;

sizeof(float) = 4;

sizeof(double) = 8;

2.对于Struct,当结构体的元素的长度小于处理器位数(32位 = 4字节)时,便以结构体中最长的数据元素为对齐条件。

例:

 

运行结果如下:

在结构体A中,a的大小为1,b的大小为4,c的大小也为4, a按4字节对齐,所以结构体A的大小为3*4=12字节

 

3.对于数组及指针,

int a[20] ;  sizeof(a) = 20 * sizeof(int) = 80   对于数组计算的是数组的全部大小;

int* a = new int[20]; sizeof(a) = 4  对指针大小进行计算;

char str[]="012345"; sizeof(str) = 7 包含隐含的'/0',转义字符算一个字节;

 

4.对于位域,一个字节 = 8bit,元素按照一个字节进行对齐,

 

运行结果如下:

1002进制是1100100,去掉后面5位余11放入x.s3中,所以结果是3。

注意:对于联合体,取其中最大的元素作为联合的大小,见第6条

5.对于空的类

class A {};  sizeof(A) = 1; 默认空类是有一个占位符的,但是如果类中有虚函数,如下:

 

sizeof(A)=4;sizeof(B) =4; 任何含有虚函数的类都拥有一个vptr指针,用来指向虚函数表vtablesizeof(vptr) = 4

注意:class A{static int a;}; sizeof(A) = 1; 对于静态成员变量是分配在全局存储区的,所以A还是相当于空类。

  class C:public virtual A {}; sizeof(C)=4; 对于虚拟继承的类拥有虚函数表,所以空类C含有vptr.

 

6.对于联合体,取其中最大的元素作为联合的大小

 

7.使用malloc或者new 分配内存,void *pp = malloc(10);  sizeof(p) = 4; 跟指针一样,sizeof 只能测出静态数组的长度,无法检测动态分配的或外部数组大小

 

8.下面函数输出结果:对于char str[100]或者char str[] 参数都退化为char* str,这样的函数即使传入char s[10] 也是可以的

 

结果:sizeof( char* ) = 4;

为什么是这样结果呢,因为数组传参时,相当于把数组的首指针传递给形参,也就相当于传递的参数是char* str,因此结果是指针的大小,那么如何强制str100位数组?可以如此声明 char ( &str )[100];

理解顺序:第一、str声明为一个引用;第二、引用一个100元素数组;第三、 数组元素每个为int大小。


结果:100*sizeof(char) = 100

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值