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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为未初始化的std :: string变量分配了多少内存?相关的知识,希望对你有一定的参考价值。

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

答案

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

另一答案

虽然没有具体说明,但值得一提的是:在实践中,实现避免为未初始化的字符串分配内存。

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

  • 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个指针:数据开始,数据结束和容量结束),尽管我不知道具体细节。

另一答案

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

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

#include <iostream>
#include <string>

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

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

    system("PAUSE");
    return 0;
}

我得到28个字节。

以上是关于为未初始化的std :: string变量分配了多少内存?的主要内容,如果未能解决你的问题,请参考以下文章

声明变量以保存字符串列表时的内存分配

在 C 中,为啥我的初始化为 0 的 int 变量会被“nm”报告为未初始化?

将 std::string 转换为无符号字符数组

带有自定义分配器的 std::string

std::string 通过索引分配似乎不起作用

在将 std::string 分配给模板参数期间编译时出错