sizeof运算符返回一条表达式或一个类型名字所占的字节数。满足右结合律,得到一个size_t类型(无符号整数)的常量表达式(constexpr)。形式如下:
sizeof (type)
sizeof expr
sizeof并不实际计算其运算对象的值,运算结果部分地依赖于其作用的类型:
- 对char或者类型为char的表达式执行sizeof运算,结果为1。
- 对引用类型执行sizeof运算得到被引用对象所占空间的大小。
- 对指针执行sizeof运算得到指针本身所占用空间的大小。
- 对解引用指针执行sizeof运算得到指针所指的对象所占空间的大小,指针不需要有效(因为并不实际执行解引用)。
- 对数组执行sizeof运算得到整个数组所占空间的大小,sizeof并不会把数组转换成指针来处理。
- 对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。因为string和vector是类类型,类类型对象的大小由类定义决定,而这两个类都定义了其他数据成员。比如string str="123";,sizeof str的结果并不等于3,vector<int> ivec{1,2,3};sizeof ivec的结果并不等于12。
因为sizeof的返回值是一个常量表达式(constexpr),所以可以用sizeof的结果声明数组的维度:
constexpr size_t sz=sizeof(ia)/sizeof(*ia); //ia是一个数组
int arr[sz]; //OK,sizeof返回一个常量表达式