sizeof运算符

sizeof运算符返回一条表达式或一个类型名字所占的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t类型的常量表达式(size_t是一种与机器相关的无符号类型,例如:typedef int size_t;定义了size_t为整型。它被设计的足够大以便能表示内存中任意对象的大小)。

运算符的运算对象有两种形式:
sizeof (type)

sizeof expr

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

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

1)对char或者类型为char的表达式执行sizeof运算,结果得1

2)对引用类型执行sizeof运算得到引用对象所占空间的大小

3)对指针执行sizeof运算得到指针本身所占空间的大小

4)对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需要有效(在sizeof的运算对象中解引用一个无效的指针仍然是一种安全的行为,因为指针实际上并没有真正使用,sizeof不需要真的解引用指针也能知道它所指对象的类型)

5)对数组执行sizeof运算得到整个数组所占空间的大小,等价与对数组中的所有元素各执行一次sizeof运算并将所求结果求和。

6)对string对象或者vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。

另外,因为执行sizeof运算能得到整个数组空间的大小,所以可以用数据的大小除以单个元素的大小得到数组中元素的个数。

面试中可能会提到的一下相关问题

问题一:定义一个空的类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果是多少?

答:答案是1。(为什么不是0)。空类型的实例中不含有任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定,在vs中,每个控类型的实例占有1个字节的空间。

 

问题二:如果在空的类型中添加一个构造函数和一个析构函数,在对该类型求sizeof,得到的结果又是多少?

答:还是1。调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与实际类型无关,编译器也不会因为这个函数而在实例内添加任何额外的信息。

 

问题三:如果把上述问题中的析构函数声明为虚函数呢?

答:C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向该虚函数的表的指针,在32位机上,一个指针占4字节的空间,因此sizeof得到4,如果是64位机上,则一个指针占8字节的空间,因此求sizeof得到8。

猜你喜欢

转载自blog.csdn.net/weixin_38736371/article/details/82972295