我无法复制双重分配,因为显然我的libstdc++根本没有为空字符串分配任何内容。然而,调整大小确实分配了26个字节,gdb帮助我识别
how they are composed
:
size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
( 1 + 1) * 1 + 24
所以记忆主要是为了这个
_Rep
表示,它又由以下数据成员组成:
size_type _M_length; // 8 bytes
size_type _M_capacity; // 8 bytes
_Atomic_word _M_refcount; // 4 bytes
我想最后四个字节只是为了对齐,但我可能漏掉了一些数据元素。
我想这是主要原因
_代表
堆上分配的结构是,它可以在字符串实例之间共享,并且可能还可以避免空字符串,因为我的系统上缺少第一个分配。
要了解为什么您的实现没有利用这种空字符串优化,请查看
the default constructor
。其实施似乎取决于
_GLIBCXX_FULLY_DYNAMIC_STRING
,这在您的设置中显然是非零的。我不建议直接更改该设置,因为它以下划线开头,因此被认为是私有的。但您可能会发现一些公共设置会影响此值。