本节将介绍 C++ 中的 sizeof() 运算符。sizeof() 是一个编译时运算符,主要用于计算变量或任何其他用户定义或预定义数据类型的大小。
sizeof() 运算符测量变量、常量以及数据类型的大小。由于它在编译时返回任何变量或常量的大小,因此它是一种编译时运算符。大小是计算机使用的 RAM 量,由 sizeof() 操作确定。
有时用户希望知道编译器分配了多少内存,因此 C++ 设计者为此提供了 sizeof(data) 关键字。sizeof() 运算符以整数格式和字节为单位返回一个值或结果。
sizeof(data_type);
上述语法中提到的数据类型可以是用户定义的数据类型、变量、常量、联合、结构,甚至可以是数据的数据类型。
sizeof() 运算符主要可以应用于以下操作数类型
当且仅当参数包含变量的数据类型时,sizeof() 运算符才会返回该数据类型的大小。
例如
通过利用 sizeof() 运算符,我们评估了上述程序中内置数据类型的大小。我们已经知道,int 占用四个字节,float 占用四个字节,double 占用八个字节,char 占用一个字节。正如我们在上述程序的输出中看到的那样,sizeof() 运算符给出了相同的答案。
当操作数是类类型时会发生什么?让我们通过一个简单的例子来理解。
#include <iostream>
using namespace std;
class Boss {
int a;
};
int main() {
Boss b;
std::cout << "The size of class Boss will be : " << sizeof(b) << std::endl;
return 0;
}
输出
The size of class Boss will be: 4
在前面的程序中,我们确定了具有单个整数变量的类的大小。由于 int 变量占用 4 个字节,因此结果将是 4 个字节。
假设,如果我们在类中再添加一个整数变量,那么代码将如下所示:
#include <iostream>
using namespace std;
class Boss {
int a;
int d;
};
int main() {
Boss b;
std::cout << "The size of class Boss will be : " << sizeof(b) << std::endl;
return 0;
}
输出
The size of class Boss will be : 8
上面的代码中又添加了一个整数变量。在这种情况下,类将是 8 个字节长,因为一个 int 变量占用 4 个字节,两个整数变量占用 8 个字节。
假设,如果我们在相同的代码中添加 char 变量,那么我们的代码将如下所示:
#include <iostream>
using namespace std;
class Boss {
int a;
int d;
char ch;
};
int main() {
Boss b;
std::cout << "The size of class boss will be : " << sizeof(b) << std::endl;
return 0;
}
输出
The size of class boss will be : 12
上面的代码中,类包含两个整数变量和一个字符变量。我们的计算结果将是类占用 9 个字节 (int+int+char),但是,由于结构填充的概念,这是不正确的。
当操作数是数组类型时会发生什么?让我们通过一个简单的例子来理解。
#include <iostream>
using namespace std;
int main()
{
int arr[]={40,50,60,70,80};
std::cout << "The size of the array 'arr'will be : "<<sizeof(arr) << std::endl;
return 0;
}
输出
The size of the array 'arr'will be : 20
在上面的程序中,我们声明了一个包含五个整数类型元素的数组。我们使用 sizeof() 运算符确定了数组的大小。由于 int 数据类型占用 4 个字节,并且数组中有 5 个条目,因此总共需要 5 * 4 = 20 个字节的内存空间,因此数组的大小应为 20 个字节。正如我们在下面的输出中看到的那样,sizeof() 操作产生了相同的结果。
现在让我们尝试打印数组的大小
#include <iostream> using namespace std; void fun(int arr[]) { std::cout << " The size of the array will be : " <<sizeof(arr)<< std::endl; } int main() { int arr[]={40,50,60,70,80}; fun(arr); return 0; }
输出
The size of the array will be : 8
我们尝试在上述程序中使用该函数输出数组的大小。在这种情况下,我们构建了一个整数类型的数组并将 'arr' 传递给函数 fun()。fun() 函数主要将返回整数指针的大小,即 int*,并且在 64 位操作系统中 int* 的大小是 8 个字节。
当操作数是指针类型时会发生什么?让我们通过一个简单的例子来理解。
我们在前面的程序中确定了指针的大小。所有数据类型的指针大小都相同。如果计算机是 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;
}
输出
8
在上述程序中,我们主要声明了两个变量,num1 和 num2,它们分别属于 int 和 double 类型。整数的大小为 4 个字节,而 double 的实际大小为 8 个字节。因此,该变量是 double 类型,占用 8 个字节。