为什么std::string尺寸由sizeof(std::string)屈服确定8?
我认为这应该不仅仅是8因为它必须有一个int(sizeof(int) == 8在我的机器上)数据成员给予std::string::length()和std::string::size()在O(1)和可能是一个char*字符.
Mat*_*son 33
std::stringC++标准未指定实现.它只描述了类的行为.但是,我希望课堂上有一个以上的指针信息.特别是:
它当然可以将所有这些存储在动态分配的位置,因此占用与char*[在大多数架构中] 完全相同的空间量.
实际上看一下我的Linux机器附带的C++头文件,当你看到它时,实现是非常清楚的(根据评论,它是"pre-C++ 11",但我认为大致具有代表性):
size_type
length() const _GLIBCXX_NOEXCEPT
{ return _M_rep()->_M_length; }
Run Code Online (Sandbox Code Playgroud)
然后按照:
_Rep*
_M_rep() const _GLIBCXX_NOEXCEPT
{ return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
Run Code Online (Sandbox Code Playgroud)
这反过来导致:
_CharT*
_M_data() const _GLIBCXX_NOEXCEPT
{ return _M_dataplus._M_p; }
Run Code Online (Sandbox Code Playgroud)
这导致
// Data Members (private):
mutable _Alloc_hider _M_dataplus;
Run Code Online (Sandbox Code Playgroud)
然后我们到达:
struct _Alloc_hider : _Alloc
{
_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
: _Alloc(__a), _M_p(__dat) { }
_CharT* _M_p; // The actual data.
};
Run Code Online (Sandbox Code Playgroud)
关于字符串的实际数据是:
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};
Run Code Online (Sandbox Code Playgroud)
所以,它是一个简单的指针,被称为_M_p隐藏在几个getter层和一些铸造......
Pau*_*ans 23
因为所有std::string商店实现都是指向存储所有数据的堆的指针.
| 归档时间: |
|
| 查看次数: |
9644 次 |
| 最近记录: |