sizeof运算符返回到一条表达式或类型名字所占用的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t 类型的常量表达式。运算符的运算对象有两种形式:
sizeof(type) sizeof expr
因为sizeof满足右结合律并且与*运算符的优先级一样,所以表达式按照从右向左组合。也就是说sizeof(*p)。其次因为sizeof不会实际求运算对象的值,所以即使p是一个无效的指针也不会有什么影响。在sizeof的运算对象中解引用一个无效的指针仍然是一种安全的行为,因为实际上并没有被真正的使用。sizeof不需要真的解引用指针也能知道他所指的对象的类型。
C++11 新标准允许我们使用作用于运算符来获取类成员的大小。通常情况下只有通过类的对象才能访问类的成员,但是sizeof运算符无须我们提供一个具体的对象,因为想要知道类成员的大小无须真的获取该成员。
- sizeof运算符的结果部分地依赖于起作用的类型:
- 对char或者类型为char的表达式执行sizeof运算,结果得1;
- 对引用类型执行sizeof运算得到被引用对象所占空间大小;
- 对指针执行sizeof运算得到指针本身所占控件大小
- 对解引用执行sizeof运算得到的指针指向的对象所占空间的大小,指针不需要有效
- 对数组执行sizeof运算得到整个数组所占控件大小,等价于对数组中所有元素各执行一次sizeof运算并将所得结果求和。注意,sizeof运算不会把数组转化成指针来处理。
- 对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用多少空间。
- 因为执行sizeof运算能得到整个数组的大小,所以用数组的大小除以单个元素的大小得到数组中元素的个数:
因为sizoef的返回值是一个常量表达式,所以我们可以用sizeof的结果声明数组的维度。