【问题标题】: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 个字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多