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)
大概就这些内容,如果后面想到其它的再补充。