2017-09-08 27 views
11

std::vector<bool>の特殊化は、C++ 11 23.3.7/1で指定されているように、データメンバー(たとえば、hereおよびhereと記載)を宣言しません。なぜstd :: vector <bool>に.data()がないのですか?

質問:なぜstd :: vectorに.data()がないのですか?これはなぜboolのベクトルがメモリに連続して格納されていないのと同じ問題です。そうしないとどんなメリットがありますか?

boolの配列へのポインタが返されないのはなぜですか?

+2

'ベクトル'は、いくつかのブールを1バイトにまとめることでスペースの最適化を可能にします。 'data()'はその利益を取り除きます。 – Jarod42

+3

利点は、メモリを8倍減らすことです。欠点は、あなたが人々の期待を混乱させることです。それは、多かれ少なかれ、欠点が利益を上回ると結論づけられている。 – nwp

+3

'std :: vector 'は法律であなたの母親をあなたと一緒に暮らすように招待しているようなものです。当時は良いアイデアのように思えるかもしれませんが、最終的にはアイデア全体を後悔します。幸運にも、私はこれらの違反の一つで自分自身を信じることができます。 – Bathsheba

答えて

23

なぜstd :: vectorに.data()がありませんか?

std::vector<bool>は1バイトに複数の値を格納するためです。

すべてのブール値に1ビットが必要な圧縮されたストレージシステムのように考えてみましょう。だから、代わりにメモリブロックごとに一つの要素(アレイ・セルごとに一つの要素)を有するので、メモリレイアウトは次のようになります。

enter image description here

はどのように、あなたがインデックスに値を取得するためのブロックを望んでいることだろうと仮定すると、演算子[]を使用していますか? bool&を返すことはできません(1バイトを返します)。boolsを格納しています。したがって、bool*を割り当てることができませんでした。つまり、bool *bool_ptr =&v[0];であり、有効なコードはではないため、コンパイルエラーが発生します。

さらに、正しい実装ではその特殊化が行われておらず、メモリの最適化(圧縮)が行われない可能性があります。したがって、data()は、実装に応じて期待される戻り値の型にコピーする必要があります(または標準では、単に許可するのではなく、最適化を強制する必要があります)。

なぜ、boolの配列へのポインタが返されないのですか?

std::vector<bool>ないので、したがってないポインタは簡単な方法で返されないことができ、boolsのアレイとして記憶されます。データを配列にコピーしてその配列を返すことで可能ですが、そうしないと設計上の選択です(そうした場合、すべてのコンテナに対してdata()として動作すると思います)。

そうしないとどのようなメリットがありますか?

メモリの最適化。

通常、1バイトに複数のビットを格納するため、メモリ使用量が8倍少なくなります。正確には、CHAR_BIT以下です。

+1

ところで、正しい実装ではその特殊化がなく、メモリの最適化が行われない可能性があります。 'data()'は実装に応じて期待される戻り値の型にコピーしなければなりません。 (または標準では、単に許可するのではなく、最適化を強制する必要があります)。 – Jarod42

+2

「8倍少ない」とは、必ずしも真実ではなく、そうでなければ標準化の賛成を得ているこの答えを台無しにする。 'CHAR_BIT'またはそれに類するものに改正しますか? – Bathsheba

+1

@gsamaras:もしできれば、私はもう一度upvoteしたいと思います。 – Bathsheba

関連する問題