C++中的sizeof()用法

1.是什么

sizeof()是什么呢?是一个函数吗?其实sizeof是C++中的关键字,神奇吧。

看一下百度上对sizeof的解释:

返回类型名或表达式具有的类型对应的大小。C++11新增支持直接对类的数据成员作为操作数(之前无法使用)。sizeof的操作数是不被求值的,利用这一点可以配合模版元编程测试类型正确性。

通常来说,为了不出错,还是用sizeof()的形式。(因为c++对sizeof有一些扩展,加个用着()最保险)

2.怎么用

主要分为以下几个点:

  • 对基本数据类型使用
  • 对变量、数组使用
  • 对结构体、类使用
  • 对联合体/共用体使用
  • 对函数使用
  • 对枚举类型使用

依次来看看吧。

2.1 基本数据类型

eg:sizeof(int),sizeof(double)......

该多少就是多少,主要注意有些数据类型大小与系统的位数有关。

16位系统int为2字节,64位系统long为8字节,指针在16/32/64为系统中分别为2/4/8字节。

2.2 变量数组

int a[10] = {0};
int* p = a;

对变量使用没什么,与对数据类型使用结果一样。

主要是对数组使用,对数组使用结果为数组长度*单元大小,sizeof(a) = 4*10 = 40。

其次要分清楚是数组还是地址,假设在32位系统,sizeof(p) = 4,sizeof(&a) = 4。

2.3 结构体、类

https://blog.csdn.net/pix_csdn/article/details/89217711

可以去看这一篇,有详细说明。

  • 空的结构体、类,sizeof结果为1
  • 若里面仅存在空数组,结果为0
  • 静态变量不占空间
  • 类中若有虚函数,需多加一个指针大小(虚函数表)
  • 类中方法(函数)不占空间

总结一下,大概就是这几点。

2.4 联合体/共用体union

union U1{
    int n;
    char s[11];
    double d;
};

主要有几点

  • 联合体中所有成员相对于基地址的偏移都是0
  • 联合体大小要能放下类中最宽的成员
  • 联合体对齐方式要适合类中所以成员

假设为32位系统,联合体首地址为0x00。

根据1,2两点,我们可以算出:

n  地址为0x00 - 0x03

ch地址为0x00 - 0x0a

d  地址为0x00 - 0x07

最长为ch,占11个字节,但是为了满足3,union需要补全5个字节(16字节才是double的整数倍)

所以sizeof结果为16

2.5 对函数使用

int f1(int a) {
    a++;
    return 0;
}

sizeof (f1(10));

也是有几点:

  • 对函数使用需要加上参数
  • 其sizeof结果为函数返回值类型的大小
  • 对void函数使用返回1,会产生warning(禁止对void函数使用)

2.6 对枚举类型使用enum

  • 对枚举类型使用相当于sizeof(int)

大概就这些内容,如果后面想到其它的再补充。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值