未初始化的std :: string变量分配了多少内存?

时间:2018-11-08 21:25:51

标签: c++ string memory

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

我已经使用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体系结构(由于任何标准库的感觉)。

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

答案 2 :(得分:0)

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

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

#include <iostream>
#include <string>

int main() {
    std::string a = "";

    std::cout << sizeof(a) << '\n';

    system("PAUSE");
    return 0;
}

我得到28个字节。