7

標準では、整数型、enum、およびから選択できますstd::bitset

これらの選択肢を考えると、なぜライブラリの実装者は一方を他方よりも優先して使用するのでしょうか?

適切な例として、llvm の libcxx は、これらの実装オプションの (少なくとも) 2 つの組み合わせを使用しているようです。

ctype_base::mask整数型を使用して実装されます。 <__locale>

regex_constants::syntax_option_typeenum+ オーバーロード された演算子を使用して実装されます。<regex>

gcc プロジェクトの libstdc++ は3 つすべてを使用します。

ios_base::fmtflags列挙型 + オーバーロードされた演算子を使用して実装されます。<bits/ios_base.h>

regex_constants::syntax_option_type整数型を使用して 実装され、 Bothregex_constants::match_flag_typeを使用して実装されます。std::bitset
<bits/regex_constants.h>

私の知る限り、gdbはこれら3つの選択肢のいずれのビットフィールドネスも「検出」できないため、強化されたデバッグとの違いはありません。

enum解と整数型の解は、常に同じスペースを使用する必要があります。std::bitsetを保証するものではないようですsizeof(std::bitset<32>) == std::uint32_tので、何が特に魅力的なのかわかりませんstd::bitset

マスクのenum組み合わせは列挙子を生成しないため、解決策は型の安全性がわずかに低いようです。

厳密に言えば、上記はn3376に関するものであり、FDIS に関するものではありません (私は FDIS にアクセスできないため)。

この分野で利用可能な啓発をいただければ幸いです。

4

3 に答える 3

2

本当に驚くべきことは、標準がそれをたった 3 つの選択肢に制限していることです。クラス型が受け入れられないのはなぜですか? とにかく…</p>

  • 整数型は最も単純な代替手段ですが、型の安全性が欠けています。非常に古いレガシー コードは、これらが最も古いものであるため、これらを使用する傾向があります。
  • 列挙型は安全ですが扱いにくく、C++11 までは のサイズと範囲に固定される傾向がありましたint
  • std::bitsetbitset<5>bitset<6>は異なる型であり、加算は許可されていませんが、それ以外は整数型と同様に安全ではありません。から派生した型を許可していれば、これは問題になりませんstd::bitset<N>

s が理想的な代替手段であることは明らかenumですが、型安全性は実際には不要であることが経験から証明されています。そのため、彼らは実装者に骨を投げつけ、より簡単な方法を取ることを許可しました。つまり、簡単な答えは、怠惰さが実装者にintorを選択させるということbitsetです。

から派生した型が許可されないのは少し奇妙ですbitsetが、実際にはそれは些細なことです。

句が提供する主な仕様は、これらの型に対して定義された一連の操作 (つまり、ビット単位の演算子) です。

于 2012-03-27T04:16:32.323 に答える
2

私の好みは列挙型を使用することですが、整数を使用する正当な理由がある場合もあります。通常ctype_base::mask、ネイティブ OS ヘッダーと対話し、 からおよびused forなどの実装定義の定数ctype_base::maskへのマッピングを使用します。整数を使用すると、ネイティブ OS API で ctype_base::mask を直接使用することが容易になる場合があります。<ctype.h>_CTYPE_L_CTYPE_Uisupperislower

<regex>libstdc++ が .を使用する理由がわかりませんstd::bitset。そのコードがコミットされたとき、ある時点で整数型を列挙型に置き換えることを心に留めましたが<regex>、私が取り組む優先事項ではありません。

于 2012-05-04T22:38:22.180 に答える
0

ライブラリを実装するさまざまな方法を標準が許可するのはなぜですか? 答えは、なぜですか?

見てきたように、いくつかの実装では明らかに 3 つのオプションすべてが使用されています。標準では、回避できる場合、既存の実装を非準拠にすることは望んでいません。

ビットセットを使用する理由の 1 つは、そのサイズが列挙型や整数よりも適していることです。すべてのシステムにstd::uint32_t. たぶん、bitset<24>そこでうまくいくでしょうか?

于 2012-03-25T06:46:03.553 に答える