2010-11-25 16 views
1

GNUのstd::string実装では、_S_empty_rep_storageは次のように定義されています。なぜstd :: stringは空のrepであるのですか?

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) 
    ]; 

charではなくsize_typeという用語で定義されるのはなぜですか?

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

結果が同じではないためですか? –

+0

"単純に" char "ではなく単に" CharT "ではなく" say "を意味するのですか? –

+0

"自分の文字列クラスを実装する"には疑問符が全部書かれています。あなたはそれをする必要があると絶対に確信していますか? – CJBrew

答えて

1

特に、charではなくwchar_tを使用している場合は、_CharTのサイズが異なる場合があります。

私は質問の一部にしか答えていないことを認識しています。私はRep_baseのものがどういう形で定義されているのかよく分かりませんが、一般的にはSTLを使ってどうやって動作するか心配しないことが最善です。それだけで幸せになります。

基本的なバグを見つけられない可能性が非常に高いためです。

1

アラインメントと丸め。 + sizeof(size_type) - 1)/sizeof(size_type)部分は、次に高い数字のsize_type要素に切り上げられます。

+0

丸めを理解しています。アライメントは明らかではなかった。しかし、単純な_CharT配列が単純な構造体の中に唯一のものとして置かれていれば、(より明確なコードはもちろんのこと、)より良い整列を得ると思うでしょう。ストレージは構造体(クラス)である "rep"のためのものです。 –

関連する問題