我有以下声明
char c[] = "Hello";
string c2 = "Hello";
我想比较a)需要多少字节的内存和b)字符长度。 我知道字符数组在字符串的末尾添加一个空终止符,而不是字符串数据类型。
使用
cout << "The sizeof of c: " << sizeof(c);
cout << "The sizeof of c2: " << sizeof(c2);
返回6和4,我不知道为什么4而不是5? 长度函数如何比较...
当我使用以下代码时
cout << "The sizeof of c: " << sizeof(c);
cout <<"The sizeof of c2: " << c2.length();
我得到6和5 ......但它是否以相同的方式比较长度? 感谢。
答案 0 :(得分:8)
a)有多少记忆需要和
您正确使用了sizeof运算符来确定字符数组占用的字节数。
是
sizeof( c )
对于类型std::string
的对象,它占用两个内存区。第一个用于分配对象本身,第二个用于分配对象所持有的字符串。
所以
sizeof( c2 )
将为您提供对象占用的内存大小。
c2.capacity()
将为您提供分配用于存储字符串的对象的大小,以及将来可能填充的一些其他字符。
当我使用以下代码cout&lt;&lt; “c的大小:”&lt;&lt; 的sizeof(C); cout&lt;&lt;“c2的大小:”&lt;&lt; c2.length();
我得到6和5
如果你想比较字符串本身而没有字符数组有的终止零,那么你应该写
cout << "The length of c: " << std::strlen(c);
cout <<"The length of c2: " << c2.length();
您将获得结果5和5。
您可以使用std :: string类型的对象进行以下实验。
std::string s;
std::cout << sizeof( s ) << '\t' << s.capacity() << '\t' << s.length() << std::endl;
std::string s1( 1, 'A' );
std::cout << sizeof( s1 ) << '\t' << s1.capacity() << '\t' << s1.length() << std::endl;
std::string s3( 2, 'A' );
std::cout << sizeof( s2 ) << '\t' << s2.capacity() << '\t' << s2.length() << std::endl;
std::string s3( 16, 'A' );
std::cout << sizeof( s3 ) << '\t' << s3.capacity() << '\t' << s3.length() << std::endl;
答案 1 :(得分:3)
sizeof(c)
是数组的大小,它包含用它初始化的文字中的五个字符,加上末尾的零值终结符,总共有六个字节。
sizeof(c2)
是string
类的大小,它不会告诉您任何特别有用的内容。该类管理包含字符串字符的动态分配的内存;这不是string
对象本身的一部分。
c2.length()
是由c2
管理的字符串中的字符数;五个字符。
答案 2 :(得分:2)
a)需要多少字节的内存,以及b)字符长度
变量'c'在堆栈上使用6个字节(5个字母和空终止符)
sizeof(c)= 6,strlen(c)= 5
所需内存总字节数:6
如果'c'有1000个字符,
所需内存总字节数:1001
变量'c2'在堆栈上使用4个字节(我怀疑是指针,但尚未确认), 其他地方至少有5个字节(我认为堆)。
sizeof(c2)= 4,c2.size()= 5,strlen(c2.c_str())= 5
所需内存总字节数:9+(4 + 5)+
如果'c2'有1000个字符,即c2.size()== 1000
堆栈上有4个字节,
在其他地方至少1000字节(取决于实施,可能还有一些)
所需内存总字节数:1004 +
注意:std :: string是一个容器。我认为没有指定这些值, 并应视为依赖于实现。
答案 3 :(得分:1)
我猜[]的大小包括终止空字符,因此5 + 1 = 6个字节。
字符串对象的大小返回4个字节,这可能是指向字符串对象的指针的大小。 32位。
在最后一种情况下,您正在使用编程的长度来计算字符数。
答案 4 :(得分:0)
c[] = "Hello"
的大小是6,因为char数组需要再分配1个字节
内存为\0
个空字符。
length()
函数返回字符串文字中的字符数。计数时不包含空\0
字符。
答案 5 :(得分:0)
std::string
,如std::unique_ptr
,std::shared_ptr
和std::vector
,是智能指针加上一些额外的操作成员函数。
当您将一个传递给sizeof
时,您需要测量智能指针的大小 - sizeof (std::string)
,而不是内容。