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

问题描述 投票:-1回答:3

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

c++ string memory
3个回答
3
投票

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


3
投票

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

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


0
投票

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

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

#include <iostream>
#include <string>

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

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

    system("PAUSE");
    return 0;
}

我得到28个字节。

© www.soinside.com 2019 - 2024. All rights reserved.