【问题标题】:c++ sizeof( string )c++ sizeof(string)
【发布时间】:2010-09-02 16:52:06
【问题描述】:
#include <cstdlib>
#include <iostream>

int main(int argc, char *argv[])
{
   cout << "size of String " << sizeof( string );
        
   system("PAUSE");
   return EXIT_SUCCESS;
}

输出:

字符串大小 = 4

这是否意味着,由于sizeof(char) = 1 Byte (0 to 255),字符串只能包含4 个字符?

【问题讨论】:

  • “字符串”从何而来?通过编译器运行示例代码会产生编译错误,因为许多事情是未定义的。 (我无法想象大小,但最幼稚的“字符串”实现只有 4 个。)
  • @dash-tom-bang 刚刚编辑以包含我的头文件
  • @Kevin:这些标题都不一定定义string。如果你想要std::string,那么它来自&lt;string&gt;cout 来自 &lt;iostream&gt;,但它位于命名空间 std。花一点时间来获取一些可以编译的代码:在他们知道string 在你的程序中实际上是什么之前,没有人可以回答你的问题,他们所能做的就是猜测你遗漏了什么。
  • 我应该补充一点:如果&lt;iostream&gt; 包含&lt;string&gt; 对你来说并不奇怪,但如果它为你做了一个using namespace std; 那就相当令人惊讶了...
  • 想想你在问什么。你真的相信字符串只能包含四个字符吗?我确定你不会。请询问您真正在想什么。

标签: c++ string


【解决方案1】:

从您的示例中不清楚“字符串”是什么。如果你有:

#include <string>
using namespace std;

那么stringstd::stringsizeof(std::string) 为您提供类实例及其数据成员的大小,而不是字符串的长度。为此,请使用:

string s;
cout << s.size();

【讨论】:

    【解决方案2】:

    string定义为:

    char *string;
    

    sizeof(string) 告诉你指针的大小。 4 个字节(您在 32 位机器上。)您尚未分配任何内存来保存文本。你想要一个 10 字符的字符串吗?字符串 = malloc(10);现在 string 指向一个 10 字节的缓冲区,您可以将字符放入其中。

    sizeof(*string) 将为 1。字符串指向的大小,一个字符。

    如果你这样做了

    char string[10];
    

    sizeof(string) 将是 10。这是一个 10 字符数组。 sizeof(*string) 仍然是 1。

    查找和理解 __countof 宏是值得的。

    更新:哦,是的,现在包含标题 :) 'string' 是一个实例占用 4 个字节的类,仅此而已。这 4 个字节可能指向更有用的东西,例如包含超过 4 个字符的内存区域。

    您可以执行以下操作:

    string s = "12345";
    cout << "length of String " << s.length();
    

    【讨论】:

      【解决方案3】:

      sizeof(char) 始终为 1 个字节。一个byte,我们认为它是8-bits need not be the case。有些架构的字节是 32 位、24 位等等。应用于任何其他类型的sizeofsizeof(char) 的倍数,即by definition 1

      接下来要注意的重要一点是 C++ 具有三种字符类型:plain char, signed char and unsigned charplain charsignedunsigned。因此,假设 char 只能具有 0 到 255 之间的值是错误的。仅当 char 为 8 位且 plain charunsigned 时才成立。

      话虽如此,假设'string'是'std::namespace'sizeof(string) == 4意味着'std::string'类的大小是4个字节。它占用的字节数是该机器上 'char' 占用的字节数的 4 倍。 Note that signed T, unsigned T always have the same size。这并不意味着实际的字符缓冲区(通常称为字符串)只有 4 个字节。在'std::string' 类中,有一个动态分配的非静态成员指针来保存输入缓冲区。这可以包含系统允许的尽可能多的元素(C++ 对此长度没有限制)。但是由于'std::string' 类只保存指向这个可能无限长的缓冲区的指针,所以 sizeof(std::string) 始终与给定架构上的 sizeof 指针相同,在您的系统上为 4。

      【讨论】:

        【解决方案4】:

        我知道很多人都回答了你的问题,但这里有几点:

        1. 不是string的大小,也不是字符串的容量,这个值代表了string类的结构大小,你可以通过它的实现看到(而且它可以在不同的实现之间变化)是一个简单的指针;
        2. 由于sizeof(string) 是类结构的大小,您将获得唯一内部指针的大小,在您的情况下为 4 个字节(因为您在 32 位机器中,这可以从平台到平台);
        3. string 类中的这个指针指向一个内存缓冲区,该类将保存真正的字符串数据,这个内存缓冲区根据需要重新分配,它可以随着您追加/删除/创建更多的字符串文本而增加/减少;
        4. 如果你想得到字符串的实际大小,你需要调用类中的size()方法,它会检查内存缓冲区字符串大小(这与内存缓冲区大小不同)。

        我认为您的问题是您对sizeof 的概念,请参阅更多信息herehere 是对其工作原理的一些解释。

        【讨论】:

          【解决方案5】:

          一点也不。这意味着该类的结构是,它不包括它可以控制的动态内存。 std::string 将动态扩展以满足任何所需的大小。

          s.max_size() // will give the true maximum size
          s.capacity() // will tell you how much it can hold before resizing again
          s.size() // tells you how much it currently holds
          

          sizeof 得到的 4 可能是某种指向更大结构的指针。尽管某些平台上的一些优化会将其用作实际的字符串数据,直到它变得超出容纳能力为止。

          【讨论】:

            【解决方案6】:

            不,表示类字符串的大小为4。

            这并不意味着一个字符串可以包含在 4 个字节的内存中。一点也不。但是你必须区分动态内存,用于包含可以构成字符串的size字符,以及由这些字符中的第一个字符的地址占用的内存

            试着这样看:

            contents  --------> |h|e|l|l|o| |w|o|r|ld|\0|
            

            sizeof 4 是指内容占用的内存。它的内容是什么?只是指向 char 数组中第一个字符(的地址)的指针。

            一个字符串可以包含多少个字符?理想情况下,内存中每个字节可用一个字符。

            一个字符串实际上有多少个字符?好吧,有一个名为 size() 的成员函数会告诉你这一点

            size_type size() const
            

            SGI 页面上查看更多信息!

            【讨论】:

            • "sizeof class String is 4"究竟是什么意思?
            • 字符串类函数所需的成员变量的大小。
            • 这是pointerclass 字符串的大小。在这种情况下,它似乎是一个 32 位整数。
            • @Kevin:意思是写string foo的时候,占用栈上的四个字节。字符串的实际字符不是字符串对象本身的一部分;它们位于字符串根据需要分配的动态内存中。
            • 那么我可以在一个字符串中存储多少个字符的限制是什么:示例字符串 a = "aksldjfkljklj234kljk123;4jklj123kj4k;jsdkl;jfkjsdklfjsdfsdf" 是否合法?
            【解决方案7】:

            string 对象包含一个 指针,指向包含实际字符串数据的堆上的缓冲区。 (它还可以包含其他特定于实现的元信息,但你的显然没有。)所以你得到的是那个指针的大小,而不是它指向的数组的大小。

            【讨论】:

            • 在 GCC 的实现中,std::string 由一个指向过度分配结构的指针组成,该结构将大小、容量和缓冲区一起保存在同一个连续内存块中。在其他一些实现中也可能并不罕见。
            • 微软在他们的CString 类中使用了这种方法,但令人惊讶的是他们的std::string 版本没有。
            【解决方案8】:

            你也可以使用字符串,可以通过 string.length() 函数找出它的长度。看下面的代码:

            // Finding length of a string in C++
            
            #include<iostream>
            #include<string>
            using namespace std;
            
            int count(string);
            
            int main()
            {
            string str;
            cout << "Enter a string: ";
            getline(cin,str);
            cout << "\nString: " << str << endl;
            cout << count(str) << endl;
            
            return 0;
            
            }
            
            int count(string s){
            if(s == "")
              return 0;
            if(s.length() == 1)
              return 1;
            else
                return (s.length());
            
            }
            

            您可以从以下位置获取详细信息: http://www.programmingtunes.com/finding-length-of-a-string-in-c/

            【讨论】:

              【解决方案9】:

              size() of string 给出字符串中元素的数量,而 string 上的 sizeof() 函数给出三个额外的位。字符数组的 strlen() 给出元素的数量 + 1(因为 null char 分隔符)并记住 char 的大小是 1 字节。 char 数组上的 sizeof() 给出分配给数组的大小

              string str="hello";
              char arr[x]="hello";
              cout<<str.size()<<endl<<sizeof(str)<<endl;
              cout<<strlen(arr)<<endl<<sizeof(arr)<<endl;
              

              输出为 5 8 5 x

              【讨论】:

              • 在这个响应中,你混​​淆了字节和位,给出了错误的信息(strlen不加1)。
              • 作为一个经验事实确实如此。我已在所有数据类型上运行此代码并存储了结果。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-20
              • 1970-01-01
              • 2013-12-05
              • 2019-04-22
              • 1970-01-01
              相关资源
              最近更新 更多