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,元素按照一个字节进行对齐,
运行结果如下:
100的2进制是1100100,去掉后面5位余11放入x.s3中,所以结果是3。
注意:对于联合体,取其中最大的元素作为联合的大小,见第6条
5.对于空的类
class A {}; sizeof(A) = 1; 默认空类是有一个占位符的,但是如果类中有虚函数,如下:
sizeof(A)=4;sizeof(B) =4; 任何含有虚函数的类都拥有一个vptr指针,用来指向虚函数表vtable。sizeof(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,因此结果是指针的大小,那么如何强制str为100位数组?可以如此声明 char ( &str )[100];
理解顺序:第一、str声明为一个引用;第二、引用一个100元素数组;第三、 数组元素每个为int大小。
结果:100*sizeof(char) = 100