我运行了一个小型测试程序来验证我们的工具是否从SSO中受益:
// Example program
#include <iostream>
#include <string>
int main()
{
std::cout << sizeof(std::string) << " " << std::string().capacity() << std::endl;
}
现在我对结果感到有些困惑:为什么std :: string的短容量只有15个字节,而内存大小却是32个?由于1字节是标签,因此在这种情况下,我希望字符串长度短为31字节。剩下的16个字节会怎样?
编辑:我已经找到了源代码。
struct _Alloc_hider : allocator_type // TODO check __is_final
{
#if __cplusplus < 201103L
_Alloc_hider(pointer __dat, const _Alloc& __a = _Alloc())
: allocator_type(__a), _M_p(__dat) { }
#else
_Alloc_hider(pointer __dat, const _Alloc& __a)
: allocator_type(__a), _M_p(__dat) { }
_Alloc_hider(pointer __dat, _Alloc&& __a = _Alloc())
: allocator_type(std::move(__a)), _M_p(__dat) { }
#endif
pointer _M_p; // The actual data.
};
_Alloc_hider _M_dataplus;
size_type _M_string_length;
enum { _S_local_capacity = 15 / sizeof(_CharT) };
union
{
_CharT _M_local_buf[_S_local_capacity + 1];
size_type _M_allocated_capacity;
};
如您所见,成员_M_dataplus和_M_string_length不在sso联合中。它们一起占用16个字节(指针为8个字节,大小为8个字节)。但是为什么要这样设计呢?为什么不将_M_allocated_capacity放入_Alloc_hider并使其成为联合的一部分。