C++ sizeof 总结

简介

sizeof 应该算是面试中常被问到的一个点。今后也多针对面试中经常会遇到的知识展开学习一下。接下来把 C++ Primer 书中相关的知识总结一下。还有动手实践一下。

是什么

运算符。返回 一条表达式 或者 一个类型 所占的字节数。没错它不是函数,别搞错了;

例子 + 提取知识

运算一下 — 了解一下优先级
	int x = 2, y = 3;
	cout << sizeof x + y << endl;
	cout << sizeof x * y << endl;
	cout << (sizeof x < y) << endl;
	cout << (sizeof (x < y)) << endl;
  // 结果:7 12 0 1
sizeof的结果

相信看了第一个例子对 sizeof 使用,加上概念,大致明白它的计算结果是什么了。接下来用这个 demo 算算各种数据类型所占空间的大小。

	double *b;
	vector<int> vec;
	vec.push_back(sizeof(int));
	vec.push_back(sizeof(char));
	vec.push_back(sizeof(string));
	vec.push_back(sizeof(float));
	vec.push_back(sizeof(double));
	vec.push_back(sizeof(*b));
	for (int i = 0; i < vec.size(); ++i) cout << vec[i] << endl;
	cout << sizeof (vec) << '\n';
  // 结果:4 1 24 4 8 8 24
  • 现在想想它的概念,返回一个类型 或 一个表达式 所占的字节大小,再看看第二个 demo 的计算结果,是不是这回事儿呢?
  • 为什么 sizeof(vec) == 24?Primer 上的解释是对于 string 与 vector 对象 只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。其实说简单点,就是它返回一个定值,不信可以在 vec 里再 push_back 几个数,看看 sizeof(vec) 还是不是 24。
一个思考 — 与指针、数组有关

先看 Demo

	int x[10]; char *p;
	cout << sizeof(x) / sizeof(*x) << endl;
	cout << sizeof(p) / sizeof(*p) << endl;
	cout << sizeof(p) << endl;
	cout << sizeof(*p) << endl;
  // 结果 10 8 8 1
  • 得到整个数组的元素个数:sizeof(x) / sizeof(*x) 整个数组大小 除以 单个数组大小,这里sizeof(x)等价于所有数组元素进行 sizeof 运算求和;
  • 指针呢?我的理解是,sizeof§ 得到的是 char类型地址的大小,sizeof(*p) 得到的是 char 类型的大小。因为在敲的时候,把 char 换成 int ,p和 *p 分别进行 sizeof 运算的结果是 8 和 4。不过自己理解的还不算很透彻,这算一定程度上的推测吧。欢迎拍砖。
摘录几句“天书”
  • 对解引用指针执行 sizeof 运算得到指针指向的对象所占空间的大小,指针不需要有效;(我的理解是有不有效都可以,反正 sizeof 不在乎,它在乎的是类型的大小。而且还很安全,因为我 sizeof 不用啊~);
  • 对于 string 与 vector 对象 只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间;(这一点的解释看上面第二个 Demo 下面的总结);
  • sizeof 可以声明数组的维度(我还没试,敲一次之后估计会有收获);
  • 对引用类型执行 sizeof 运算符得到被引用对象所占空间的大小(同样待实现)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值