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

How About string datatype is stored as bytes

问题

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

有什么问题

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
}

有什么解释吗?

为什么会这样?谁能解释一下字符串数据类型如何存储自身?

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

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', '[=20=]' }),包括终止零。

并且在这个声明中

std::cout<<sizeof "//n"<<endl;

还有字符串文字大小的输出 "//n",包含 4 个字符,包括终止零。

基本上,一个std::string对象只不过是一个指向实际字符串数据1的指针,以及一些关于它包装的字符串的信息(比如它的当前长度).可能还有其他特定于实现的数据推高了这个数字。

并且要了解像 "n" 这样的字符串文字的大小,您需要了解 C++ 中的所有字符串文字实际上都是常量字符数组,包括 字符串空终止符。所以例如"n" 实际上是两个字符的数组:'n' 字符和 '[=14=]' 字符串终止符。

这意味着你声称 sizeof "//n" 是三个字节是错误的,它实际上是四个字节。

最后,数组的大小就是数组的总大小。换句话说,每个元素的大小乘以元素的数量。


1 虽然这是 std::string 的 "classic" 观点,但并不总是正确的,因为通常有一些叫做 短字符串优化的东西 其中短字符串可以完全存储在 std::string 对象本身中。没有定义 "short string" 的标准化限制,它实际上是一个实现细节。