【问题标题】:How About string datatype is stored as bytes字符串数据类型如何存储为字节
【发布时间】:2020-03-03 01:37:19
【问题描述】:
问题
你好!
我的问题是关于字符串数据类型值,当它存储为字节时。
请参阅下面的代码:
有什么问题
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
}
有什么解释吗?
为什么会这样?有人可以解释一下字符串数据类型是如何存储自己的吗?
【问题讨论】:
标签:
c++
string
sizeof
c-strings
string-literals
【解决方案1】:
基本上,std::string 对象只不过是一个指向实际字符串数据1 的指针,以及它所包装的字符串的一些信息(如其当前长度)。可能还有其他特定于实现的数据推高了这个数字。
要了解像"n" 这样的字符串字面量的大小,您需要了解C++ 中的所有字符串字面量实际上都是常量字符数组,包括 字符串空终止符。所以例如"n" 实际上是一个包含两个字符的数组:'n' 字符和 '\0' 字符串终止符。
这意味着你声称sizeof "//n" 是三个字节是错误的,它实际上是四个字节。
最后,数组的大小就是数组的总大小。换句话说,每个元素的大小乘以元素的数量。
1 虽然这是std::string 的“经典”视图,但并非总是如此,因为通常有一种称为短字符串优化的东西可以完全存储短字符串在 std::string 对象本身内。没有定义“短字符串”的标准化限制,它实际上是一个实现细节。
【解决方案2】:
首先是这个语句的输出
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 个字符。