我对如何计算C ++中不同数据类型的大小有一些疑问,我有int
,char
,unsigned char
,unsigned int
,{{1} },double
,在我运行string
后,计算机给了我sizeof(i)
的答案。我最近在很多不同的教程中学习过,对这个结果感到非常困惑,有些人认为sizeof(int/unsigned int)==4; sizeof(char/unsigned char)==1; sizeof(string)==32;
大小是8个字节,有点像,真的很混乱......
顺便说一下,当我宣布一个unsigned int
时,我说char
之间的区别string
,string
之间的差异让我感到很困惑。我也可以声明string mystring="asd";
。这真的很令人困惑,我只是一个初学者,希望有人能帮助我走向正确的方向。
有人可以帮帮我吗?
答案 0 :(得分:2)
C ++最初是基于C语言,它是一种紧密遵循硬件的语言。对于硬件而言,有许多不同大小(字节,半字,单词等)的不同数据类型是有意义的,因此C遵循这一点是有意义的,这是由C ++继承的(也可以使用制作靠近硬件运行的程序。
数据类型的大小取决于编译器及其所针对的硬件,并且可以在平台之间甚至在同一平台上的不同编译器之间有所不同。例如,在64位Windows系统上,使用Visual Studio时类型long
为32位(四个字节),而使用GCC时long
为64位(八个字节)。
一般来说,你可以说
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
此外,C ++规范表明,无论sizeof(char)
的实际大小如何,1
总是 char
。无符号和有符号类型sizeof(unsigned int) == sizeof(signed int)
之间也没有区别。
对于结构和类的大小,粗略地说,结构或类的大小是结构或类中成员的大小的总和。因此,如果您有一个具有两个int
成员变量的结构(或类),那么结构(或类)的大小将为sizeof(int) + sizeof(int)
。然而,这不是完整的事实,因为编译器可能会向结构添加填充以使成员变量最终位于结构内部的良好对齐位置,并且在获取结构的大小时也会计算此填充。
答案 1 :(得分:1)
C ++标准对各种数据类型的大小非常开放;实现允许变化很大。
作为规则的快速摘要:
sizeof(int)通常为4或8,具体取决于编译器对64位数字的处理方式。但你不应该假设这一点。
sizeof(std :: string)和sizeof(char)不同的原因是char是系统中最小可寻址单元的类型,C字符串只是它们的数组。因此,如果您编写char* a = "abcd"; std::cout << sizeof(a) << std::endl;
,您将获得系统中指向char的指针大小。另一方面,std :: string是一个类。 std::string a = "abcd"; std::cout << sizeof(a) << std::endl;
将为您提供std :: string类的完整大小,包括填充,函数表,std :: string的每个成员等。
答案 2 :(得分:-2)
对于数据类型的大小,您不必担心它。您始终可以使用sizeof();
运算符来始终检查数据类型的大小。没有必要,因为不同数据类型的大小取决于计算机和操作系统的类型。对于string
和char
,实际上字符串只是一个由char
组成的对象。因此,如果您使用string
声明一个字符串,该字符串将成为类string
的对象。如果你使用char
声明一个字符串(通过实际声明为指针类型char*
的方式),那么该字符串只是char
类型的一系列字符。您还可以使用数组声明字符串。例如char name[9] = Christina
。实际上有很多方法可以根据其目的声明字符串。但是字符串对象具有更多功能,所以它。查看string object c++以获取有关字符串对象的更多信息。我希望这会有所帮助。