sizeof 是运算符,而不是函数。虽然我们习惯sizeof(...),但( )并不是必需的,它只是表示优先级。我们把sizeof后面的目标叫对象或者操作数。本文约定就叫sizeof对象。
当sizeof 的对象是表达式时,求的大小是表达式返回值的类型大小,但并不计算表达式的值
同样如果对象是函数,则返回函数返回值类型大小,也不执行函数体
注意sizeof 对象是指针和数组的区别。
当sizeof的对象是数组时,返回数组总大小,而当对象是指针时,返回指针本身的大小,而不是指示内存空间的大小;
但注意:当数组名作为实参传入函数时,会自动转化为指针类型;但并不影响形参的类型;
sizeof 无法获取动态分配的内存大小,即使用malloc动态的分配内存,无法使用sizeof获取其大小。
关于结构体类型
理论上一个结构体所占空间是所有成员的大小总和,但由于考虑到对齐问题,会有填充字节。
一、结构体默认按自然对界对齐;
二、#pragma pack(n)规定的对齐长度,实际使用的规则是:
1)结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,起始位置必须是对齐模数的整数倍。对齐模数是#pragma pack指定的数值和数据成员的长度中比较小的那个。就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
2) 结构体的对齐,按照结构体中size最大的数据成员和#pragma pack指定值之间,较小的那个进行。eg:pack(4) struct a{int c1; char c2; char c3;}; 大小为8字节 pack(4) struct b{int c1; char c2; int c3;};大小为12字节
关于类
空类的大小为1字节;空类型实例中不包含任何信息,应该大小为0. 但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。g++中每个空类型的实例占1字节空间。注意空struct即空类,这就是为什么c++的空struct占一个字节的原因。
含有虚函数的类要加一个虚表指针的大小,32位系统下为4字节,64位下为8字节;