Почему пустой ответ std :: string такой, какой он есть? - PullRequest
1 голос
/ 25 ноября 2010

В реализации GNU для std::string его _S_empty_rep_storage определяется как:

template<typename _CharT, typename _Traits, typename _Alloc>
  typename basic_string<_CharT, _Traits, _Alloc>::size_type
  basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
    (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) / sizeof(size_type)
  ];

Почему он определяется в терминах size_type, а не просто char?Почему он не определен как:

template<typename _CharT, typename _Traits, typename _Alloc>
  _CharT
  basic_string<_CharT, _Traits, _Alloc>::_Rep::_S_empty_rep_storage[
    sizeof(_Rep_base) + sizeof(_CharT)
  ];

?

К вашему сведению: причина, по которой я спрашиваю, состоит в том, что я реализую свой собственный класс строки (который имеет другие требования, * 1013)* не соответствует), поэтому я хотел бы понять как можно больше о том, как реализован std::string.

Ответы [ 2 ]

1 голос
/ 25 ноября 2010

Выравнивание и округление.Часть + sizeof(size_type) - 1) / sizeof(size_type) округляется до следующего большего числа элементов size_type.

1 голос
/ 25 ноября 2010

Размер _CharT может отличаться, в частности, если вы используете wchar_t, а не char.

Я понимаю, что отвечает только на часть вопроса.Я не уверен, почему материал Rep_base определяется так, как он есть, но в целом с STL лучше не слишком беспокоиться о том, как он работает;просто будь счастлив, что это так.

Потому что вы (очень) вряд ли найдете фундаментальную ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...