C++ sizeof() 运算符
sizeof() 是一个用来计算数据类型、常量和变量大小的运算符。它是一个编译时运算符,因为它在编译时返回变量或常量的大小。
sizeof() 运算符计算的大小是在计算机中占用的RAM数量。
sizeof() 运算符的语法如下:
sizeof(data_type);
在上面的语法中,data_type 可以是数据、变量、常量、联合体、结构体或任何其他用户定义的数据类型。
sizeof() 运算符可应用于以下操作数类型:
- 当操作数是数据类型时
如果 sizeof() 运算符的参数包含一个变量的数据类型,则 sizeof() 运算符将返回数据类型的大小。
让我们通过一个例子来理解这种情况。
#include <iostream>
using namespace std;
int main()
{
// Determining the space in bytes occupied by each data type.
std::cout << "Size of integer data type : " <<sizeof(int)<< std::endl;
std::cout << "Size of float data type : " <<sizeof(float)<< std::endl;
std::cout << "Size of double data type : " <<sizeof(double)<< std::endl;
std::cout << "Size of char data type : " <<sizeof(char)<< std::endl;
return 0;
}
在上面的程序中,我们通过使用sizeof()运算符评估了内置数据类型的大小。正如我们所知,int占用4个字节,float占用4个字节,double占用8个字节,char占用1个字节,sizeof()运算符显示了相同的结果,我们可以在以下输出中观察到。
输出
- 当操作数是类类型时。
#include <iostream>
using namespace std;
class Base
{
int a;
};
int main()
{
Base b;
std::cout << "Size of class base is : "<<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 << "Size of class base is : "<<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 << "Size of class base is : "<<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 << "Size of the array 'arr' is : "<<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 << "Size of array is : " <<sizeof(arr)<< std::endl;
}
int main()
{
int arr[]={10,20,30,40,50};
fun(arr);
return 0;
}
在上面的程序中,我们尝试使用函数打印数组的大小。在这种情况下,我们创建了一个整数类型的数组,并将 ‘arr’ 传递给函数 ‘fun()’ 。函数 ‘fun()’ 将返回整数指针的大小,即 int* ,在64位操作系统中 int* 的大小为8个字节。
输出:
- 当操作数为指针类型时。
#include <iostream>
using namespace std;
int main()
{
int *ptr1=new int(10);
std::cout << "size of ptr1 : " <<sizeof(ptr1)<< std::endl;
std::cout << "size of *ptr1 : " <<sizeof(*ptr1)<< std::endl;
char *ptr2=new char('a');
std::cout <<"size of ptr2 : " <<sizeof(ptr2)<< std::endl;
std::cout <<"size of *ptr2 : "<<sizeof(*ptr2)<< std::endl;
double *ptr3=new double(12.78);
std::cout <<"size of ptr3 : " <<sizeof(ptr3)<< std::endl;
std::cout <<"size of *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;
}
上述程序中,我们声明了两个变量num1和num2,分别为int和double类型。int类型的大小为4个字节,而double类型的大小为8个字节。结果将是一个double类型的变量,占用8个字节。
输出: