我试图使用 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
?
我也不明白,拜托
根据您的库实现,
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++.