在std::string
的GNU实现中,其_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)
];
仅供参考:我问的原因是因为我正在实现自己的字符串类
(具有std::string
不符合的不同要求)
所以我想尽可能多地了解std::string
的实施方式。
答案 0 :(得分:1)
_CharT的大小可能会有所不同,特别是如果您使用的是wchar_t而不是char。
我意识到这只回答了部分问题。我不确定为什么Rep_base的东西是以它的方式定义的,但一般来说STL最好不要太担心它是如何工作的;只是为它感到高兴。
因为你非常(非常)不太可能找到一个基本的错误。
答案 1 :(得分:1)
对齐和舍入。 + sizeof(size_type) - 1) / sizeof(size_type)
部分向上舍入到下一个更高数量的size_type
元素。