C++11 之 将sizeof用于类成员

为君一笑 提交于 2019-12-10 20:04:49

sizeof运算符 (主要复习 sizeof,带一下C++11的特性)

sizeof 运算符返回一条表达式或一个类型名字所占的字节数。 sizeof运算符满足右结合律,其所得的值是一个size_t 类型(unsigned int)的常量表达式。
运算符的运算对象有两种形式:

sizeof (type)
sizeof expr

在第二种形式中,sizeof返回的是表达式结果类型的大小。与从不同的一点是,sizeof并不实际计算其运算对象的值

Sales_data data, *p;
sizeof(Sales_data);		//存储Sales_data类型的对象所占的空间大小
sizeof data;			//data 的类型的大小,即sizeof(Sales_data)
sizeof p;			//指针所占的空间大小
sizeof *p;			//p 所指类型的空间大小,即sizeof(Sales_data)
sizeof data.revenue;		//Sales_data的revenue 成员对应类型的大小
sizeof Sales_data::revenue;	//另一种获取 revenue大小的方式 
在sizeof的运算对象中解个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用。

如上述代码最后一句,C++11新标准允许我们使用作用域运算符来获取类成员的大小。通常情况下只有通过类的对象才能访问到类的成员,但是sizeof 运算符无须我们提供一个具体的对象,因为要想知道类成员的大小无须真的获取该成员。

sizeof 运算符的结果部分地依赖于其作用的类型:

  1. 对 char或者类型为char 的表达式执行sizeof 运算,结果得1。
  2. 对引用类型执行 sizeof运算得到被引用对象所占空间的大小。
  3. 对指针执行 sizeof运算得到指针本身所占空间的大小。 (指针本身大小)
  4. 对解引用指针执行 sizeof 运算得到指针指向的对象所占空间的大小,指针不需要有效。
  5. 对数组执行 sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次 sizeof运算并将所得结果求和。 注意,sizeof运算不会把数组转换成指针来处理。
  6. 对 string 对象或vector对象执行sizeof运算 只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间 。

上述第六条如下所示:

vector<int> arr(10);		//包含10个元素
for(auto i = arr.begin(); i != arr.end() - 5; i++)
	*i = 1;
cout << sizeof arr;	

结果为:

6


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!