来自gcc 7的std :: string的小字符串优化

时间:2018-07-27 12:25:25

标签: string gcc memory optimization libstdc++

我运行了一个小型测试程序来验证我们的工具是否从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并使其成为联合的一部分。

0 个答案:

没有答案