【问题标题】:how much memory is allocated to an uninitialized std::string variable?为未初始化的 std::string 变量分配了多少内存?
【发布时间】:2018-11-08 21:25:50
【问题描述】:

如果我声明了一个 std::string 类型的变量但没有初始化它,那么分配了多少内存?我知道,如果我将它初始化为“hello”,例如,将为每个字符保留一个字节加上一个用于空字符的字节,总共 6 个。是否在字符串类的某处定义了默认长度? (我尝试在字符串头文件中查找实际定义但不知道在哪里找到它)

【问题讨论】:

  • 我们计算类本身所需的内存还是只计算它存储的数据?
  • 查找实现的地方是它的默认构造函数和声明数据成员的地方,但绝不保证在实现或版本之间保持一致。
  • 它可能是 0 字节,但它没有定义(据我所知)。并且不要混淆为数据分配的内存和为std::string 分配的内存(这是恒定的)。您是在问使用了多少内存还是分配了多少?而一些std::string 的实现使用了小字符串优化,因此它可以使用std::string 的内存直接存储短字符串,而不需要分配其他任何东西。这个问题有很多方法,很难知道你到底在问什么。
  • 您是在询问某个特定平台上会发生什么、通常会发生什么或保证会发生什么?

标签: c++ string memory


【解决方案1】:

未指定。不同的实现可能会在默认构造时分配不同数量的内存,并且不需要实现告诉您这是多少内存。但是,我相信现在std::string 最常见的是采用短字符串优化,在这种优化下,默认构造的std::string 不需要分配任何内存,除了std::string 类本身的大小。有关详细信息,请参阅Meaning of acronym SSO in the context of std::string。请注意,sizeof(std::string) 也未指定。

【讨论】:

    【解决方案2】:

    虽然未指定,但有一点值得一提:在实践中,实现会避免为未初始化的字符串分配内存。

    我使用 Compiler Explorer (link to the test) 对通常的 sizeof(std::string) 进行了一些测试。以下是结果,当然您可以尝试更多:

    • gcc / Linux / x86-64 / libstdc++ : 32 字节
    • gcc / Linux / x86 / libstdc++ : 24 字节
    • clang / Linux / x86-64 / libc++(注意:不是 libstdc++!):24 字节
    • clang / Linux / x86 / libc++ : 12 字节
    • msvc / Windows / x86-64 / VC 运行时:32 字节
    • msvc / Windows / x86 / VC 运行时:24 字节
    • gcc / Linux / ARM64 / libstdc++ : 32 字节
    • gcc/Linux/ARM(32 位)/libstdc++:24 字节
    • msvc / Windows / ARM64 / VC 运行时:32 字节(注意:CE 上的输出为十六进制)

    粗略地说,在实践中,std::string 对象将有 12 到 32 个字节大,不包括动态分配的内存。

    这些结果主要取决于标准库的实现和 CPU 架构(因为标准库喜欢做什么)。

    请注意,这些大小确实包括 SSO,@Brian 在他的回答中讨论了这一点。我相信这是 libstdc++ 和 MS 实现使用 32 字节而不是 24 字节的动机(因为我怀疑通常涉及 3 个指针:数据开始、数据结束和容量结束),尽管我不知道具体情况。

    【讨论】:

      【解决方案3】:

      您可以随时检查自己。这取决于您使用的计算机,要检查数据类型大小,您始终可以使用size:of

      在你的情况下,它看起来像这样

      #include <iostream>
      #include <string>
      
      int main() {
          std::string a = "";
      
          std::cout << sizeof(a) << '\n';
      
          system("PAUSE");
          return 0;
      }
      

      我得到 28 个字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        • 2023-02-23
        相关资源
        最近更新 更多