std::vector<bool>
の特殊化は、C++ 11 23.3.7/1で指定されているように、データメンバー(たとえば、hereおよびhereと記載)を宣言しません。なぜstd :: vector <bool>に.data()がないのですか?
質問:なぜstd :: vectorに.data()がないのですか?これはなぜboolのベクトルがメモリに連続して格納されていないのと同じ問題です。そうしないとどんなメリットがありますか?
boolの配列へのポインタが返されないのはなぜですか?
std::vector<bool>
の特殊化は、C++ 11 23.3.7/1で指定されているように、データメンバー(たとえば、hereおよびhereと記載)を宣言しません。なぜstd :: vector <bool>に.data()がないのですか?
質問:なぜstd :: vectorに.data()がないのですか?これはなぜboolのベクトルがメモリに連続して格納されていないのと同じ問題です。そうしないとどんなメリットがありますか?
boolの配列へのポインタが返されないのはなぜですか?
なぜstd :: vectorに.data()がありませんか?
std::vector<bool>
は1バイトに複数の値を格納するためです。
すべてのブール値に1ビットが必要な圧縮されたストレージシステムのように考えてみましょう。だから、代わりにメモリブロックごとに一つの要素(アレイ・セルごとに一つの要素)を有するので、メモリレイアウトは次のようになります。
はどのように、あなたがインデックスに値を取得するためのブロックを望んでいることだろうと仮定すると、演算子[]
を使用していますか? bool&
を返すことはできません(1バイトを返します)。bools
を格納しています。したがって、bool*
を割り当てることができませんでした。つまり、bool *bool_ptr =&v[0];
はであり、有効なコードはではないため、コンパイルエラーが発生します。
さらに、正しい実装ではその特殊化が行われておらず、メモリの最適化(圧縮)が行われない可能性があります。したがって、data()
は、実装に応じて期待される戻り値の型にコピーする必要があります(または標準では、単に許可するのではなく、最適化を強制する必要があります)。
なぜ、boolの配列へのポインタが返されないのですか?
std::vector<bool>
はないので、したがってないポインタは簡単な方法で返されないことができ、boolsのアレイとして記憶されます。データを配列にコピーしてその配列を返すことで可能ですが、そうしないと設計上の選択です(そうした場合、すべてのコンテナに対してdata()
として動作すると思います)。
そうしないとどのようなメリットがありますか?
メモリの最適化。
通常、1バイトに複数のビットを格納するため、メモリ使用量が8倍少なくなります。正確には、CHAR_BIT
以下です。
'ベクトル'は、いくつかのブールを1バイトにまとめることでスペースの最適化を可能にします。 'data()'はその利益を取り除きます。 –
Jarod42
利点は、メモリを8倍減らすことです。欠点は、あなたが人々の期待を混乱させることです。それは、多かれ少なかれ、欠点が利益を上回ると結論づけられている。 – nwp
'std :: vector'は法律であなたの母親をあなたと一緒に暮らすように招待しているようなものです。当時は良いアイデアのように思えるかもしれませんが、最終的にはアイデア全体を後悔します。幸運にも、私はこれらの違反の一つで自分自身を信じることができます。 –
Bathsheba