首先,sizeof 不是函数也不是操作符,更像是一个特殊的宏,在编译阶段预处理。sizeof 不能被编译成机器码,因此sizeof(a = 3) 并不会对a的值做出改变。
用法
1、sizeof(object) 这时括号可以不用 sizeof object
2、sizeof (typename)
sizeof(a)
sizeof(int)
sizeof 2
sizeof(2)
数据类型
32位C++中,char 1,short 2,int 4,long 4,double 8,long double 10
unsigned不会改变sizeof的值
函数类型
对函数的返回值进行求值
int f1() {}
void f2() {}
sizeof(f1()) 4
sizeof(f2()) error
sizeof(f1) error无法对函数指针求值
sizeof *f1 4 等同于f1()
指针
只要是指针,就是4
数组
各维数的乘积*数组元素的大小
动态数组名字相当于指针
字符串sizeof和strlen
strlen 是寻找从指定地址开始,到出现的第一个0之间的字符个数,他是在运行阶段执行的,而sizeof是得到数据的大小,在这里是得到字符串的容量。所以对同一个对象而言,sizeof 的值是恒定的。
string是C++类型的字符串,他是一个类,所以sizeof(s)表示的并不是字符串的长度,而是类string的大小。strlen(s)根本就是错误的,因为strlen的参数是一个字符指针,如果想用strlen得到s字符串的长度,应该使用sizeof(s.c_str()),因为string的成员函数c_str()返回的是字符串的首地址。实际上,string类提供了自己的成员函数来得到字符串的容量和长度,分别是Capacity()和Length()。string封装了常用了字符串操作,所以在C++开发过程中,最好使用string代替C类型的字符串。
类
用sizeof运算符对一个类型名操作,得到的是具有该类型实例的大小。
1、空类的sizeof是1
进行实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址
2、若类中包含成员,则类对象的大小只包括其中除去成员函数和静态成员经过对齐所占的空间,对齐方式和结构体相同。
(1)整体空间是 占用空间最大的成员(的类型)所占字节数的整倍数 (2)数据对齐原则----内存按结构成员的 先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。
3、若类中包含虚函数,则无论有几个虚函数,sizeof类都等于sizeof(数据成员)的和+sizeof(V表指针,为4)
4、对于子类,它的sizeof是它父类成员(无论成员是public或private),再加上它自己的成员,对齐后的sizeof
5、对于子类和父类中都有虚函数的情况,子类的sizeof是它父类成员(无论成员是public或private),再加上它自己的成员,对齐后的sizeof,再加4(虚表指针)
6、对于虚继承的子类,其sizeof的值是其父类成员,加上它自己的成员,以及它自己一个指向父类的指针(大小为4),对齐后的sizeof。
7、对于既有虚继承又有虚函数的子类,其sizeof的值是其父类成员(计算虚表指针大小+4),加上它自己的成员(计算虚表指针大小+4),以及它自己一个指向父类的指针(大小为4),对齐后的sizeof。