【问题标题】:What is the proper size of std::string in C++? [duplicate]C++ 中 std::string 的正确大小是多少? [复制]
【发布时间】:2020-02-28 11:40:47
【问题描述】:

我尝试使用sizeof(string),发现它是 24。

当我尝试创建一个字符串数组时,我发现编译器也将数组的大小乘以 24。这是 std::string 的真实大小吗?

我以为只有 4 个字节。如果真的是24字节,如何优化?

【问题讨论】:

  • 可能是 4,可能是 24,可能是 10 TB。 C++ 标准不要求任何特定对象的任何特定大小。根据您的编译选项,它甚至可能会有所不同。这就是 C++ 的工作原理,不,没有办法“优化”它。
  • 假设“字符串”是指标准头 <string> 中指定的类型 std::string,大小 (sizeof std::string) 是实现定义的(例如依赖于编译器)。此外,std::string 动态分配内存来存储其数据,因此sizeof(a_string) 与表示字符串的实际数据没有保证关系。
  • "我认为它只有 4 个字节" - 我认为您可能在某个时候在 32 位系统上的 char* 上完成了 sizeof。根本不是一回事。

标签: c++ string


【解决方案1】:

c++中的字符串类型是什么?

假设您的意思是std::string,它是一个用于连续存储的动态字符串的 RAII 容器。它是用于在 C++ 中表示文本的抽象“字符串”类型的规范类型。

sizeof(string) 我发现它是 24。当我尝试创建一个字符串数组时,我发现编译器还将数组的大小乘以 24。

这就是数组的工作方式。元素彼此分开。如果距离更小,元素会相互重叠。

这是字符串的真实大小吗?

在您的系统上,使用特定的标准库实现,是的。 sizeof 不会说谎(在标准 C++ 中)。

我以为只有4个

显然,你想错了。

如果真的是24字节怎么优化?

您可以编写自己的字符串类型。这将是很多工作,我怀疑在 64 位系统上实现 4 字节将是一个挑战。即使你实现了它,我怀疑速度损失对于获得字节的好处是不可接受的。

你自己的字符串类型不会是std::string。您只能通过编写自己的标准库来“优化”它。这将是更多的工作。

【讨论】:

  • string_instance.size() 和/或 std::size(string_instance) 可能有用。
【解决方案2】:

std::string 是标准库的一部分,用于保存字符串。它管理字符串的动态内存的分配/解除分配,并包含指向内存的指针、其大小和可能的其他数据成员。

sizeof(std::string) 返回std::string 对象的大小,而不是实际字符串的大小。它依赖于标准库的实现,并不受 C++ 标准的固定。在那个特定的实现中,它是 24 个字节。

std::string 对象数组在逻辑上的总大小是sizeof(std::string) 的倍数,因为数组总是在内存中连接的对象的多个实例。

要获取实际字符串的长度,请使用str.length(),其中strstd::string 对象。实际分配的内存大小总是至少多出 1 个字节,因为str.c_str() 将返回一个指向字符串的指针,在它的末尾有一个终止的 NULL 字节。该类在字符串更改时根据需要分配和取消分配内存,并且可能在内部分配比字符串大小所需的更多内存。

理论上,std::string 类也可以实现为小于 24 字节(例如,如果它只包含一个指针和一个整数作为长度)。这样做的一个原因是因为标准库实现做了小字符串优化,即如果字符串很短(少于24个字符),它将被放入std::string对象本身,并且它不会为它分配动态内存。因此,std::string 内还需要有一个标志来指示这一点。

此外,C++ 中的字符串文字 将不是std::string 类型,而是char[N] 类型的原始C 字符串。所以sizeof("test") 返回5,因为它是char[5]。 (字符为 4 个字节,最后再加一个 0 字节。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2014-10-20
    • 2011-05-29
    • 2011-04-23
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多