C++中的sizeof()运算符

sizeof()是一个运算符,用于计算数据类型、常量和变量的大小。它是一个编译时运算符,因为它在编译时返回变量或常量的大小。

sizeof()运算符计算出的大小是计算机中占用的RAM空间大小。

sizeof()运算符的语法如下:

sizeof(数据类型); 

在上述语法中,数据类型可以是数据、变量、常量、联合体、结构体或任何其他用户定义的数据类型。

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

  • 当操作数为数据类型时

如果sizeof()运算符的参数包含一个变量的数据类型,则sizeof()运算符将返回数据类型的大小。

让我们通过一个示例来理解这种情况。

#include <iostream>
using namespace std;
int main()
{
  // 确定每种数据类型占用的字节数。
  std::cout << "整型数据类型的大小:" <<sizeof(int)<< std::endl;
  std::cout << "浮点型数据类型的大小:" <<sizeof(float)<< std::endl;
  std::cout << "双精度浮点型数据类型的大小:" <<sizeof(double)<< std::endl;
  std::cout << "字符型数据类型的大小:" <<sizeof(char)<< std::endl;
  return 0;
}

在上面的程序中,我们使用sizeof()运算符计算了内置数据类型的大小。我们知道int占用4个字节,float占用4个字节,double占用8个字节,char占用1个字节,sizeof()运算符的结果与我们观察到的输出相同。

输出

1.png

  • 当操作数为类类型时
#include <iostream>
using namespace std;
class Base
{
  int a;
};
int main()
{
  Base b;
  std::cout << "类Base的大小为:" <<sizeof(b) << std::endl;
  return 0;
}

在上面的程序中,我们计算了只包含一个整型变量的类的大小。输出结果为4个字节,因为int变量占用4个字节。

输出

2.png

如果我们在类中再添加一个整型变量,代码如下:

#include <iostream>
using namespace std;
class Base
{
  int a;
  int d;
};
int main()
{
  Base b;
  std::cout << "类Base的大小为:" <<sizeof(b) << std::endl;
  return 0;
}

在上面的代码中,我们添加了另一个整型变量。在这种情况下,类的大小将为8个字节,因为int变量占用4个字节,所以两个整型变量占用8个字节。

3.png

如果我们在上面的代码中再添加一个字符变量,代码如下:

#include <iostream>

using namespace std;

class Base
{
  int a;
  int d;
  char ch;
};
int main()
{
  Base b;
  std::cout << "类Base的大小为:" <<sizeof(b) << std::endl;
  return 0;
}

在上面的代码中,类中有两个整型变量和一个字符变量。根据我们的计算,类的大小应该等于9个字节(int+int+char),但是由于结构填充的概念,这是错误的。

4.png

  • 当操作数为数组类型时
#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()运算符给出了相同的结果。

输出

5.png

让我们考虑另一种数组的情况。

#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的大小,即在64位操作系统中int的大小为8个字节。

输出

6.png

  • 当操作数为指针类型时
#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个字节。

输出

7.png

  • 当操作数为表达式时
#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个字节。结果将是变量num2的大小,即double类型占用的8个字节。

输出

8.png

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想