浅谈sizeof 操作符

tech2024-10-08  17

sizeof 是一个操作符,主要是作用是返回对象或者类型所占用的内存字节数量。

用法:

sizeof(object)sizeof(type_name)sizeof object

   sizeof 计算对象的大小主要是转换为对象所在的类型进行计算的。也就说同种类型对象的sizeof值都是一样的。这里的对象可以延伸到表达式,也就说说sizeof可以对表达式进行求值,编译器根据最终的计算结果类型来计算大小。sizeof是编译时进行计算的,和运行无关,不会对表达式进行计算:

#include <iostream> #include <math.h> using namespace std; int main() { cout << "sizeof(char)=" << sizeof(char) << endl; cout << "sizeof(char)=" << sizeof('c') << endl; int i = 8; cout << "sizeof(i)=" << sizeof(i) << endl; cout << "sizeof(i)=" << sizeof(i=5) << endl; cout << "i=" << i << endl; cout << "sizeof MyClass:" << sizeof(MyClass) << endl; return 0; }

输出的结果为:

  其中i=5这个值并没有被计算。还是等于8;

 当sizeof碰到数组的时候,会计算数组里面所有的元素的占用的大小。值得注意的是,sizeof碰到字符串的时候,大小会+1,因为字符串的结尾有个\0;所以大小会+1。如果碰到指针的时候,会计算指针本身的大小。(注意:如果数组g当成是函数的参数的时候传入,在函数内部进行计算数组的大小的时候,数组会当成指针来计算。)

 当sizeof碰到结构体的会按照内存对其的原则进行对其。内存对其的原则如下:

结构体的首地址可以被最宽的的基本成员类型大小所整除。结构体的每个成员变量相对于结构体首地址的偏移量是其成员大小的整数倍。结构体的总的大小是,最宽的成员变量的整数倍。

当sizeof碰到空的结构体的时候,也就是下面的第一个问题的时候。

问题:定义一个空的类型,里面没有任何的成员变量或者成员函数,对这个类型进行 sizeof 运算,结果是?

结果是1,因为空类型的实例不包含任何信息,按道理 sizeof 计算之后结果是0,但是在声明任何类型的实例的时候,必须在内存占有一定的空间,否则无法使用这些实例,至于占据多少内存大小,由编译器决定。如上的例子。

 

继续问:如果在这个类型里添加一个构造函数和析构函数,那么结果又是多少?

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

 

继续问:如果把析构函数变为虚函数呢?结果是多少?

c++编译器发现了类型里有虚函数,就会为这个类型生成一个虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针,在32位机器,指针类型大小是4字节,结果是4,64位机器中,指针大小是8字节,结果是8。

 

 

 

 

 

最新回复(0)