【问题标题】:In C++ How do I compare the size of a character array vs string?在 C++ 中,如何比较字符数组与字符串的大小?
【发布时间】:2014-11-01 23:25:17
【问题描述】:

我有以下声明

char c[] = "Hello";
string c2 = "Hello";

我想比较 a) 需要多少字节的内存和 b) 字符长度。 我知道字符数组在字符串的末尾添加了一个空终止符,而字符串数据类型则没有。

使用

cout << "The sizeof of c: " << sizeof(c);
cout << "The sizeof of c2: " << sizeof(c2);

返回 6 和 4,我不确定为什么是 4 而不是 5? 还有长度函数在这里如何比较...

当我使用以下代码时

cout << "The sizeof of c: " << sizeof(c);
cout <<"The sizeof of c2: " << c2.length();

我得到 6 和 5 ...但它是否以相同的方式比较长度? 谢谢。

【问题讨论】:

  • sizeof(c2) == 4??真的吗? c2的真实类型是什么?这显然不是std::string
  • @DavidRodríguez-dribeas:为什么不呢?包含指向元数据块的单独指针的字符串实现是否存在非法行为,ala pimpl?
  • @BenVoigt:我想这在技术上是可能的,但从未见过std::string 的任何实现。
  • sizeof 是一个编译时操作符;不是运行时函数,并且(在编译时)评估为type的大小,可以直接提供(sizeof(std::string))或通过表达式 结果类型 (sizeof c2)。最终它是基于类型的。你的问题的不同是由于类型的不同。一个是char[6],另一个是string(我只能假设是std::string,但您没有提供其他信息来确认/否认该假设)。 Read this 了解更多信息。
  • @DavidRodríguez-dribeas: libstdc++-v3 可以(这是自 C++11 以来不符合标准的旧的写时复制实现吗?):gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/bits/…

标签: c++ arrays string size character


【解决方案1】:

a) 需要多少内存和

您正确地使用了 sizeof 运算符来确定字符数组占用的字节数。

sizeof( c )

对于std::string类型的对象,那么它占用了两个内存区。第一个用于分配对象本身,第二个用于分配对象保存的字符串。

所以

sizeof( c2 )

会给你对象占用的内存大小。

c2.capacity()

将为您提供对象分配用于存储字符串的大小以及将来可能会填充的一些其他字符。

当我使用下面的代码 cout

我得到 6 和 5

如果你想比较字符串本身而不是字符数组的终止零,那么你应该写

cout << "The length of c: " << std::strlen(c);
cout <<"The length of c2: " << c2.length();

你会得到结果 5 和 5。

您可以使用 std::string 类型的对象进行以下实验。

std::string s;

std::cout << sizeof( s ) << '\t' << s.capacity() << '\t' << s.length() << std::endl;

std::string s1( 1, 'A' );

std::cout << sizeof( s1 ) << '\t' << s1.capacity() << '\t' << s1.length() << std::endl;

std::string s3( 2, 'A' );

std::cout << sizeof( s2 ) << '\t' << s2.capacity() << '\t' << s2.length() << std::endl;

std::string s3( 16, 'A' );

std::cout << sizeof( s3 ) << '\t' << s3.capacity() << '\t' << s3.length() << std::endl;

【讨论】:

    【解决方案2】:

    sizeof(c) 是数组的大小,它包含初始化它的文字中的五个字符,加上末尾的零值终止符,总共有六个字节。

    sizeof(c2)string 类的大小,它不会告诉您任何特别有用的信息。该类管理包含字符串字符的动态分配内存;这不是 string 对象本身的一部分。

    c2.length()c2管理的字符串中的字符数;五个字符。

    【讨论】:

      【解决方案3】:

      a) 需要多少字节的内存,以及 b) 字符长度

      • 变量“c”在堆栈上使用 6 个字节(5 个字母和空终止符)

      • sizeof(c) = 6, strlen(c) = 5

      • 所需内存总字节数:6


      • 如果“c”有 1000 个字符,

        • sizeof(c) = 1001, strlen(c) = 1000)
      • 所需内存总字节数:1001


      • 变量 'c2' 在堆栈上使用 4 个字节(我怀疑是指针,但尚未确认), 并且在其他地方至少有 5 个字节(我认为是堆)。

      • sizeof(c2) = 4, c2.size() = 5, strlen(c2.c_str()) = 5

      • 所需内存总字节数:9+ (4 + 5)+


      • 如果 'c2' 有 1000 个字符,即 c2.size() == 1000

      • 堆栈上有 4 个字节,并且

      • 其他地方至少 1000 字节(取决于实现,可能更多)

      • 所需内存总字节数:1004+

      注意:std::string 是一个容器。我认为没有指定这些值, 并且应该被视为依赖于实现。

      【讨论】:

        【解决方案4】:

        我猜 [] 的大小包括终止空字符,因此 5+1=6 个字节。

        字符串对象的大小返回 4 个字节,这可能是指向字符串对象的指针的大小。 32 位。

        在最后一种情况下,您使用的是编程来计算字符数的长度。

        【讨论】:

          【解决方案5】:

          c[] = "Hello" 的大小是 6,因为 char 数组需要再分配 1 个字节 空 \0 字符的内存。

          length() 函数返回字符串字面量中的字符数。计数时不包括空的\0 字符。

          【讨论】:

          • “我想比较 a) 需要多少字节的内存 和 b) 字符长度”
          • 好吧,它们都需要 6 字节的内存。只是 length() 函数不返回字节大小,而是返回编号。出现的字符数
          【解决方案6】:

          std::string,如std::unique_ptrstd::shared_ptrstd::vector,是一个智能指针加上一些额外的操作成员函数。

          当您将 1 传递给 sizeof 时,您测量的是智能指针的大小 -- sizeof (std::string),而不是内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-04
            • 2011-08-02
            相关资源
            最近更新 更多