C++ 中的 Sizeof() 运算符


2022 年 9 月 20 日, Learn eTutorial
1789

本节将介绍 C++ 中的 sizeof() 运算符sizeof() 是一个编译时运算符,主要用于计算变量或任何其他用户定义预定义数据类型的大小。

C++ 中 sizeof() 运算符的含义是什么?

sizeof() 运算符测量变量、常量以及数据类型的大小。由于它在编译时返回任何变量或常量的大小,因此它是一种编译时运算符。大小是计算机使用的 RAM 量,由 sizeof() 操作确定。

有时用户希望知道编译器分配了多少内存,因此 C++ 设计者为此提供了 sizeof(data) 关键字。sizeof() 运算符以整数格式和字节为单位返回一个值或结果。

sizeof() 运算符的语法


sizeof(data_type);  
 

上述语法中提到的数据类型可以是用户定义的数据类型、变量、常量、联合、结构,甚至可以是数据的数据类型。

sizeof() 运算符主要可以应用于以下操作数类型

  1. 当操作数是数据类型时
  2. 当操作数是类类型时
  3. 当操作数是数组类型时
  4. 当操作数是指针类型时

当操作数是数据类型时

当且仅当参数包含变量的数据类型时,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),但是,由于结构填充的概念,这是不正确的。

3. 当操作数是数组类型时

当操作数是数组类型时会发生什么?让我们通过一个简单的例子来理解。


#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 个字节。

4. 当操作数是指针类型时

当操作数是指针类型时会发生什么?让我们通过一个简单的例子来理解。

我们在前面的程序中确定了指针的大小。所有数据类型的指针大小都相同。如果计算机是 32 位操作系统,则指针大小为 4 个字节。如果计算机是 64 位操作系统,则指针大小为 8 个字节。由于我的软件使用 64 位,因此结果将是 8 个字节。现在,如果我们给指针一个“*”符号,输出将根据数据类型而变化。例如,如果 *ptr1 是整数数据类型,则 sizeof() 运算符将返回 4 个字节,因为 int 数据类型占用 4 个字节。

5. 当操作数是表达式时

当操作数是表达式时会发生什么?让我们通过一个简单的例子来理解。

#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 个字节。