sizeof() 是一个计算数据类型、常量、变量大小的运算符。它是一个编译时运算符,因为它在编译时返回任何变量或常量的大小。
由 sizeof() 运算符计算的大小是计算机中占用的 RAM 量。
sizeof() 运算符的语法如下所示:
sizeof(data_type);
在上述语法中,data_type 可以是数据的数据类型、变量、常量、联合、结构或任何其他用户定义的数据类型。
sizeof() 运算符可应用于以下操作数类型:
当操作数是数据类型时
如果sizeof()运算符的参数包含变量的数据类型,则sizeof()运算符将返回数据类型的大小。
让我们通过一个例子来理解这个场景。
#include <iostream> using namespace std; int main() { // 确定每种数据类型占用的字节空间。 std::cout << "整数数据类型的大小:" <<sizeof(int)<< std::endl; std::cout << "浮点数据类型的大小:" <<sizeof(float)<< std::endl; std::cout << "double 数据类型的大小:" <<sizeof(double)<< std::endl; std::cout << "char 数据类型的大小:" <<sizeof(char)<< std::endl; return 0; }
在上面的程序中,我们使用 sizeof() 运算符评估了内置数据类型的大小。我们知道 int 占用 4 个字节,float 占用 4 个字节,double 占用 8 个字节,char 占用 1 个字节,同样的结果由 sizeof() 运算符显示,我们可以在下面的输出中观察到。
输出
当操作数是 Class 类型时。
#include <iostream> using namespace std; class Base { int a; }; int main() { Base b; std::cout << "类基的大小为:"<<sizeof(b) << std::endl; return 0; }
在上面的程序中,我们评估了类的大小,它有一个整数变量。输出将是 4 个字节,因为 int 变量占用 4 个字节。
输出
如果我们在一个类中再添加一个整数变量,那么代码将如下所示:
#include <iostream> using namespace std; class Base { int a; int d; }; int main() { Base b; std::cout << "类基的大小为:"<<sizeof(b) << std::endl; return 0; }
在上面的代码中,我们又添加了一个整数变量。在这种情况下,类的大小将是 8 个字节,因为int变量占用 4 个字节,所以两个整数变量占用 8 个字节。
输出
如果我们在上面的代码中添加一个 char 变量,那么代码将如下所示:
#include <iostream> using namespace std; class Base { int a; int d; char ch; }; int main() { Base b; std::cout << "类基的大小为:"<<sizeof(b) << std::endl; return 0; }
在上面的代码中,该类有两个整数变量和一个字符变量。根据我们的计算,类的大小将等于 9 个字节(int+int+char),但是由于结构填充的概念,这是错误的。
输出
当操作数是数组类型时。
#include <iostream> using namespace std; int main() { int arr[]={10,20,30,40,50}; std::cout << "数组'arr'的大小是:"<<sizeof(arr) << std::endl; return 0; }
在上面的程序中,我们声明了一个包含五个元素的整数类型的数组。我们已经使用sizeof()运算符评估了数组的大小。根据我们的计算,数组的大小应该是 20 字节,因为 int 数据类型占用 4 字节,而数组包含 5 个元素,所以这个数组占用的总内存空间为 5*4 = 20 字节。sizeof()运算符显示了相同的结果,我们可以在以下输出中观察到。
输出
让我们考虑另一个数组场景。
#include <iostream> using namespace std; void fun(int arr[]) { std::cout << "数组大小为:" <<sizeof(arr)<< std::endl; } int main() { int arr[]={10,20,30,40,50}; fun(arr); return 0; }
在上面的程序中,我们尝试使用函数打印数组的大小。在这种情况下,我们创建了一个整数类型的数组,并将“ arr ”传递给函数fun()。fun()将返回整数指针的大小,即int*,而 int* 的大小在 64 位操作系统中为 8 个字节。
输出
当操作数是指针类型时。
#include <iostream> using namespace std; int main() { int *ptr1=new int(10); std::cout << "ptr1 的大小:" <<sizeof(ptr1)<< std::endl; std::cout << "*ptr1 的大小:" <<sizeof(*ptr1)<< std::endl; char *ptr2=new char('a'); std::cout <<"ptr2 的大小:" <<sizeof(ptr2)<< std::endl; std::cout <<"*ptr2 的大小:"<<sizeof(*ptr2)<< std::endl; double *ptr3=new double(12.78); std::cout <<"ptr3 的大小:" <<sizeof(ptr3)<< std::endl; std::cout <<"*ptr3 的大小:"<<sizeof(*ptr3)<< std::endl; return 0; }
在上面的程序中,我们已经确定了指针的大小。对于所有数据类型,指针的大小将保持不变。如果计算机有 32 位操作系统,那么指针的大小将是 4 字节。如果计算机有 64 位操作系统,那么指针的大小将是 8 字节。我在 64 位上运行这个程序,所以输出是 8 个字节。现在,如果我们为指针提供'*'符号,那么输出取决于数据类型,例如,*ptr1 是整数类型意味着 sizeof() 运算符将返回 4 个字节,因为 int 数据类型占用 4 个字节。
输出
当操作数是表达式时。
#include <iostream> using namespace std; int main() { int num1; double num2; cout << sizeof(num1+num2); return 0; }
在上面的程序中,我们分别声明了 int 和 double 类型的两个变量 num1 和 num2。int 的大小是 4 个字节,而 double 的大小是 8 个字节。结果将是变量,它是占用 8 个字节的 double 类型。
输出