C++教程-C++中的sizeof()运算符

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()运算符的结果与我们观察到的输出相同。
输出
- 当操作数为类类型时
#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个字节。
输出
如果我们在类中再添加一个整型变量,代码如下:
#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个字节。
如果我们在上面的代码中再添加一个字符变量,代码如下:
#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),但是由于结构填充的概念,这是错误的。
- 当操作数为数组类型时
#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的大小,即在64位操作系统中int的大小为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;
}
在上面的程序中,我们声明了两个变量num1和num2,类型分别为int和double。int类型的大小为4个字节,而double类型的大小为8个字节。结果将是变量num2的大小,即double类型占用的8个字节。
输出