如何将字符串数据类型存储为字节

问题

你好! 我的问题是关于以字节存储的字符串数据类型值。 请参阅下面的代码:

出了什么问题

int main(){
    string name,names[6];
    std::cout<<sizeof(name)<<endl; //32 bytes
    std::cout<<sizeof "n"<<endl; //2 bytes
    std::cout<<sizeof "//n"<<endl; //3 bytes
    std::cout<<sizeof(names)<<endl; //192 bytes
}

有什么解释吗?

为什么会这样?有人可以解释一下字符串数据类型如何存储自身吗?

ache2009 回答:如何将字符串数据类型存储为字节

对于初学者来说,此语句的输出

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

大家都在问