为未初始化的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变量分配了多少内存?的主要内容,如果未能解决你的问题,请参考以下文章