写出下面代码的输出结果:
- ss1,这是一个指针,所以长度为4
- ss2,这是一个数组但是没有指定长度,所以由后面的“0123456789”决定,长度为10+1(/0)=11
- ss3,长度制定了的数组,为100
- ss4,长度制订了的数组,同时int占四个word,所以为4*100=400
- q1,如ss2,为4
- q2,由于/n占一个word,所以为3(不要忘了/0)
- q3,如ss1,为4
- 对于A,B的长度:对于结构体,一般会将数据的长度对齐。如果所有数据的长度小于处理器的位数时,则以所有数据的最长长度为对齐长度。如果有数据的长度超过处理器的位数时,则以处理器的位数对齐。所以这里的A是三个short于是长度为6,而B最小需要6word,但是由于对齐的关系,short实际放在4字的内存中,所以为8
- C,D:对于一个类或者struct来讲,即使它没有任何内容,任然拥有1的空间,所以为1
- E,对于static变量,由于全局变量是放在全局存储区的,而sizeof只是计算栈中分配的内存,所以static变量不需要计入在内,所以为4
关于数据对齐:CPU的优化规则大致是:对于n字节的元素,他的首地址能被n整除才能获得最好的性能。编译器可以遵循这样一个原则:对于每个变量,可以从当前位置向后找到第一个满足的地址最为首地址。不过结构体一般会面临数组分配的问题,所以编译器为了优化这种情况,干脆把所有数据对于最长的数据对齐。
另外有关sizeof的
- sizeof的结果类型是size_t,它的类型是unsigned int
- sizeof还可以用函数做参数,比如: 输出结果等同于sizeof(short)
- 大部分编译程序在编译时就将sizeof计算好了,这说明sizeof无需执行就可以计算了
- 对于内存不确定的数据,sizeof不能使用,比如:未知存储大小的数组,void类型等
- 如果是函数传入的参数比如讲如下的代码: 当将c传入test函数后,实际返回的结果是char*的长度4,原因是函数参数传入的数组对象都会自动转换成指针
- 空类的空间是1,多重继承的空类空间也是1,但是虚继承涉及到虚表(虚指针),所以为4
以上所有内容来自《面试宝典》
本文详细解析了 C++ 中 sizeof 运算符的工作原理,并通过具体示例展示了不同数据类型及结构体在内存中所占空间的计算方法。特别关注了字符串、数组、指针以及结构体的内存分配特性。
3134





