8

ドキュメントでは、std::vector<bool>すべてのブール値が 1 ビットを占有するようにすることで、スペース効率が最適化されていることがわかります。ドキュメントから:

std::vector を空間効率的にする方法 (および最適化されているかどうか) は、実装によって定義されます。

これは、コンパイラの実装に依存するということですか? サポートしている場合、コンパイラがサポートしているかどうかはどこで確認できますか? なぜ彼らはそれをサポートしたくないのですか? 本当にシンプルで効率的な実装のようです。

そうでない場合、この最適化を実行したい場合、それは何を意味し、何を意味しますか?

TDM GCC ツールセットを使用しています。

4

3 に答える 3

3

定義済みの実装とは、抽象マシンのパラメーターを構成するものに依存することを意味します。(IE、ホスト オペレーティング システム、その実装仕様、およびシステム コールを定義するアルゴリズム)。「定義された実装」の意味に関する有益な Q&A は、こちら.

ほとんどの場合、最新のコンパイラ/IDE を備えた最新のマシンを使用している場合、実装定義がサポートされています。

コンパイラがそれをサポートしていない場合、それは彼らがそれを「望んでいない」からではなく、非常に古いコンパイラであるか、リソースが非常に限られたマシンであることが原因です。

要するに、マシンに依存します。そのため、さまざまなオペレーティング システムが独自の方法でそれを実現します。(つまり、32 ビット対 64 ビットなど) (非常に) 古いコンパイラを使用しない限り、移植性には影響しません。懸念がある場合は、コンパイラのバージョンの仕様を確認できます。これは、コンパイラとそのバージョンを検索することでオンラインで簡単に見つかります。

于 2016-07-11T06:14:54.567 に答える
2

正式な言語定義は合理的な実装を排除したくないため、常に少し注意する必要があります。

たとえば、典型的なデバッグ ビルドは依然として標準に準拠していますvector<bool>が、デバッグ モードでは圧縮されていないことがよくわかります。

現在、これは未指定ではなく、実装によって定義されています。つまり、圧縮されているかどうかはコンパイラのドキュメントのどこかにあるはずですが、標準ではドキュメントをどのように編成する必要があるかについては説明していません。

コンパイラが希望どおりにサポートしていない場合は、別のライブラリを使用できます (Boost は明らかな候補です)。vector<bool>通常、深いコンパイラ マジックに依存するクラスではないため、代替は簡単に記述できます。

于 2016-07-11T07:40:29.133 に答える