使用sizeof计算普通变量所占空间
32位操作系统下
char str[] = "Hello";
char * p = str;
int n = 0;
// str表示数组,对数组变量做sizeof运算得到的是数组占用的内存的总大小
// str的总大小为strlen("Hello") + 1,注意数组中要有一个元素保存字符
// 串结束符,所以长度为6
sizeof(str) = ?; //6
// 32位操作系统指针为4字节长度
sizeof(p) = ?; //4
// int类型为4字节长度
sizeof(n) = ?; //4
void Func(char str[100])
{
// str为函数的参数,做sizeof运算时被认为是指针,,因为调用函数Func时
// 由于数组是传地址的,程序会在栈上分配一个4字节指针指向数组
sizeof(str) = ?; // 4
}
void *p = malloc(100);
// p 首先指向一个100字节的堆内存,这里还是对指针做sizeof运算
sizeof(p) = ?; //4
sizeof计算类中的对象所占空间大小
计算原则:
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相当于结构体首地址的偏移量(offset)都是成员大小的整数倍,如果需要编译器会在成员之间加上填充字节;
- 结构体的总大小为结构体最宽基本类型大小的整数倍,如果需要编译器会在最末一个成员之后加上填充字节;
sizeof计算含有虚函数的类对象空间大小
32为操作系统下面
- 普通函数不占用内存,只要有虚函数,就会占用一个指针大小的内存,原因是系统多用一个指针维护这个类的虚函数表,并且注意这个虚函数无论含有多少项(类中含有多个虚函数)都不会再影响类的大小
sizeof和strlen的区别
- sizeof是操作符strlen是函数;
- sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型,该类型保证能容纳实现所建立的最大对象的字节大小
- sizeof可以用类型做参数,strlen只能用char*做参数,切必须以"\0"结尾的
- 数组做sizeof的参数不退化,传递给strlen就退化为指针了.
char str[20] = "0123456789";
int a = strlen(str);
int b = sizeof(str);
- a计算是以0x00结束的字符串的长度(不包括0x00结束符)结果为10;
- b计算的则为分配的数组str[20]所占的内存空间大小,不受存储内容的改变而改变,结果为20;
如果计算字符串长度,一定使用strlen
sizeof计算字符串长度会吧结束符计算进去,而strlen则不会计算进去
char num[] = "abcde";
cout << " sizeof:" << sizeof(num) << endl;
cout << " strlen:" << strlen(num) << endl;