对于初学者来说,此语句的输出
std::cout<<sizeof "//n"<<endl; //3 bytes
是4
。
在此声明中
std::cout<<sizeof(name)<<endl;
输出类型为std::string
的对象的大小。它不是存储在对象中的字符串的大小。要输出字符串的大小,您应该编写
std::cout<<name.size()<<endl;
,您将得到0
,因为该对象不包含任何字符串。
因此,如果类型为std :: string的对象的大小等于32,则包含6个此类对象的数组的大小为6 * 32 = 192
。
在此声明中
std::cout<<sizeof "n"<<endl;
存在一个字符串文字"n"
大小的输出,该字符串包含2个字符({ 'n','\0' }
),其中包括结尾的零。
在此声明中
std::cout<<sizeof "//n"<<endl;
还有一个字符串文字"//n"
大小的输出,该字符串包含4个字符,包括结尾的零。
,
基本上,std::string
对象不过是指向实际字符串数据 1 的指针,以及有关它包装的字符串的一些信息(例如其当前长度)。可能还有其他特定于实现的数据会增加这个数字。
要了解"n"
之类的字符串文字的大小,您需要了解C ++中的所有字符串文字实际上都是常量字符数组,包括 字符串空终止符。所以例如"n"
实际上是由两个字符组成的数组:'n'
字符和'\0'
字符串终止符。
这意味着您声称sizeof "//n"
是三个字节是错误的,实际上是四个字节。
最后,数组的大小是数组的总大小。换句话说,每个元素的大小乘以元素数。
1 尽管这是std::string
的“经典”视图,但它并不总是正确的,因为经常有一种称为短字符串优化的东西,其中短字符串可以是完全存储在std::string
对象本身中。没有定义“短字符串”的标准化限制,它实际上是实现细节。
本文链接:https://www.f2er.com/3151380.html