为什么 C++ 中不同数据类型的大小不同

Why different size of different data types in C++

我有一些关于如何在C++中计算不同数据类型的大小的问题,我有intcharunsigned charunsigned int、[= 14=,string,我运行后sizeof(i),电脑给了我sizeof(int/unsigned int)==4; sizeof(char/unsigned char)==1; sizeof(string)==32;的答案。最近研究了很多不同的教程,对这个结果很迷惑,有的说unsigned int size是8字节之类的,真迷惑。。。。 顺便说一句,我真的很困惑 charstring 之间的区别,当我声明 string 时,我说 string mystring="asd";。我也可以声明一个char mystring = "asd";。真的很迷茫,我只是一个初学者,希望有人能帮助我走向正确的方向。

有人能帮帮我吗?

C++最初是在C的基础上发展成为紧跟硬件的语言。对于硬件来说,拥有许多不同大小的数据类型(字节、半字、字等)是有意义的,因此 C 遵循它是有意义的,这是由 C++ 继承的(也可以使用制作 运行 接近硬件的程序。

数据类型的大小取决于编译器及其目标硬件,并且在平台之间甚至同一平台上的不同编译器之间可能不同。例如,在 64 位 Windows 系统上,使用 Visual Studio 类型 long 是 32 位(四个字节),而使用 GCC a long 是 64 位(八个字节)字节)。

一般来说可以这么说

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

此外,C++ 规范指出 sizeof(char) 总是 1,无论 char 的实际大小如何。无符号类型和有符号类型之间也没有区别,sizeof(unsigned int) == sizeof(signed int).

关于结构体和classes的大小,粗略地说,结构体或class的大小是结构体或class中成员的大小之和。所以如果你有一个结构(或class)有两个int成员变量,那么结构(或class)的大小将是sizeof(int) + sizeof(int)。然而,这不是全部事实,因为编译器可能会向结构添加填充以使成员变量最终位于结构内对齐良好的位置,并且在获取结构大小时也会计算此填充。

C++标准对于各种数据类型的大小是非常开放的;允许实现有很大差异。

作为规则的快速总结:

  • 大小(字符)== 1
  • sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  • 我不知道 sizeof(int) 和 sizeof(unsigned int) 之间的关系是什么;标准 可能 指定它们必须相等,但我不会依赖它。

现代台式机上的 sizeof(int) 通常为 4 或 8,具体取决于编译器对 64 位数字的处理方式。但你不应该这么认为。

sizeof(std::string)和sizeof(char)之所以不同是因为char是系统中最小可寻址单元的类型,而C字符串只是它们的一个数组。因此,如果您编写 char* a = "abcd"; std::cout << sizeof(a) << std::endl; ,您将获得系统中指向字符的指针的大小。另一方面,std::string 是 class。 std::string a = "abcd"; std::cout << sizeof(a) << std::endl; 将为您提供 std::string class 的完整大小,包括填充、函数表、std::string 的每个成员等。

嗯,对于数据类型的大小,您不必太担心。您始终可以使用 sizeof(); 运算符来始终检查数据类型的大小。没有必要,因为不同数据类型的大小取决于计算机和操作系统的类型。而对于stringchar,实际上string只是一个对象做成一系列char。因此,如果您使用 string 声明一个字符串,该字符串将成为 class string 的对象。如果你使用 char 来声明一个字符串(顺便说一句,它实际上被声明为一个指针类型 char*),那么该字符串只是一系列 char 类型的字符。您还可以使用数组声明一个字符串。例如 char name[9] = Christina。所以实际上有很多方法可以根据其目的声明一个字符串。但是字符串对象有更多的功能。查看 string object c++ 以获取有关字符串对象的更多信息。希望对您有所帮助。