标准字符串对象的内部结构

问题描述 投票:0回答:1

我试图使用 GDB 来理解 std::String 的内部结构,我想看看我是否也理解它。

我有 std::string 对象,其中包含字符串

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
(32 A)。

当我查看 GDB 时,我看到 标头:

0x00000020      0x00000020 0x00000000

数据:

0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141 0x41414141

当那个对象用

std::string::~string
释放时,我看到数据相同但是,标题:

0x00000000      0x00000020 0xffffffff

对吗? 0x20 是字符串的大小(为什么我看到它两次?),当 std::string 对象被释放时

0x00000000
替换为
0xffffffff
?

我也不明白,拜托

c++ string gdb std
1个回答
1
投票

根据您的库实现,

std::string
可能比预期更复杂,因为 short string optimization.

根据该答案解释,一个简单的实现可能会存储大小、容量和指向数据的指针。

简单

class string {
...
private:
    std::unique_ptr<char[]> m_data;
    size_type m_size;
    size_type m_capacity;

虽然性能更高的实现可能将短字符串作为大小和缓冲区直接存储在结构中,而较长的字符串作为大小、容量和指向数据的指针。

优化

class string {
...
private:
    size_type m_size;
    union {
        class {
            std::unique_ptr<char[]> m_data;
            size_type m_capacity;
        } m_large;
        std::array<char, sizeof(m_large)> m_small;
    };
};

可能很难在调试器中解决所有这些问题。

您也可以根据您的图书馆直接阅读代码,例如libc++.

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