3
cout << sizeof(std::string) << endl;

私の 64 ビット マシンでは結果は 8 で、これは と同じsizeof(char*)です。したがって、文字列クラスにはchar*. では、サイズ関数はどのように実装されるのでしょうか? 使用してstrlenいますか (実際のサイズまたは終了バイトへのポインターを格納していないため)?

このページでは、サイズ関数の時間複雑度が一定であることを示しているため、混乱しています。そして別のページでは、誰かがより大きな文字列サイズを持っています。

Fedora 64 ビットで GCC 4.7.1 を使用しています。

4

4 に答える 4

1

std::string が char* であるというあなたの仮定は間違っています。sizeof(std::string)==sizeof(char*) を使用した数少ない実装の 1 つを次に示します。

struct std::string
{
    string_implementation
    {
        size_t size;
        size_t buffer_size;
        char_traits whatever;
        char *buffer; // Here is your actual string!
    };

    string_implementation *ptr;
}
于 2013-09-11T22:07:49.960 に答える
1

std::stringtypdefforstd::basic_string<char>であり、(basic_string私のマシン上で) file で定義されています/usr/include/c++/4.4/bits/basic_string.h。そのファイルには多くの間接性がありますが、大まかに言えばstd::string、実際のデータへのポインターが格納されます

// Use empty-base optimization: http://www.cantrip.org/emptyopt.html
      struct _Alloc_hider : _Alloc
      {
    _Alloc_hider(_CharT* __dat, const _Alloc& __a)
    : _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;
  };

_Rep* _M_rep() const
      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
于 2013-09-11T22:28:23.113 に答える