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