c++的sizeof使用细节

使用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计算类中的对象所占空间大小

计算原则:

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  2. 结构体每个成员相当于结构体首地址的偏移量(offset)都是成员大小的整数倍,如果需要编译器会在成员之间加上填充字节;
  3. 结构体的总大小为结构体最宽基本类型大小的整数倍,如果需要编译器会在最末一个成员之后加上填充字节;

sizeof计算含有虚函数的类对象空间大小

32为操作系统下面

  • 普通函数不占用内存,只要有虚函数,就会占用一个指针大小的内存,原因是系统多用一个指针维护这个类的虚函数表,并且注意这个虚函数无论含有多少项(类中含有多个虚函数)都不会再影响类的大小

sizeof和strlen的区别

  1. sizeof是操作符strlen是函数;
  2. sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型,该类型保证能容纳实现所建立的最大对象的字节大小
  3. sizeof可以用类型做参数,strlen只能用char*做参数,切必须以"\0"结尾的
  4. 数组做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;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值