ほとんどではないにしても、多くのコンパイラが列挙型をその下のint
として扱うように思われます。 C/gccでは、enum
sはint
にコンパイルされます。 C#/ Visual C#では、基になるデータ型を次のように変更できます。
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
ただし、タイプを変更しない場合は デフォルトはint
(2番目の段落)です。
明らかな理由から、int
sは効率的です。それらはALUを簡単に通過し、無駄な文字列比較を回避します。
一見すると、インタープリター型言語には列挙型が組み込まれているようには見えません(Ruby、Perl、JavaScript、その他のことは確かです)。ただし、エミュレートすることはできます。つまり JavaScriptの場合 。
私の質問:
int
を使用するのですか?その理由は歴史的/パフォーマンスに関連していますか?int
(またはbyte
、long
、数値型..以外のものにコンパイルする言語はありますか? )?もしそうなら、なぜ彼らはそれを別の方法で行うことを選んだのですか?あなたの質問の最初の部分は、その決定がずっと前に行われたので答えるのが難しいでしょう、そして、Cのような言語の作成者に確実に知るように頼む必要があるでしょう。
あなたの2番目のポイントはかなり答えられます。
Javaは、適切に動作しないenum
定数の広範な使用に対応して、int
型を作成しました( Effective Java、Second Edition、Bloch 、Item 30/Page 147 )。たとえば、2つの整数定数を無意味な方法で乗算することはできますが、2つのenum
値で同じことを行うことはできません。整数定数を使用する場合は、RED
をBLUE
と乗算できますが、列挙型は使用できません。とにかく、それはどういう意味ですか?
さらに、この決定は、列挙型が「よりスマート」である可能性があるために行われました。値を含めることができ、各列挙値内に動作をカプセル化することもできます。脆弱でメンテナンスの問題である列挙値に対してswitch
を設定するのではなく、ロジックを反転して、各case
の本体を個々の列挙内に配置します。次に、列挙型変数のメソッドを呼び出し、 動的ディスパッチ を使用してスイッチを抽象化します。これで、列挙型の値と動作が同じクラスにローカライズされました。
C++ 11には、Javaが「インテリジェント」列挙型を実装して成功したために行われたenum class
構造が含まれるようになりました。( C++プログラミング言語、第4版、 Stroustrup 、セクション8.4 /ページ218)。
私が最もよく知っている言語に基づいて、いくつかの光を当てようとします。
[〜#〜] d [〜#〜]:
D言語の列挙子 は、コンパイル時定数を宣言するもう1つの方法です。それらは非常に柔軟性があり、文字列型の列挙型を許可しますが、これはあまり一般的ではありません。整数定数のサイズの制御も可能です。いくつかの例については、前のリンクのページの下部を参照してください。
C++:
C++の古いスタイルのスコープなし列挙型は、C++ int
オブジェクトのサイズである必要はありません。それらはそれより大きくなる可能性があります。引用 この参照 :
基になる型が固定されていないスコープ外の列挙型...この場合、基になる型は
int
であるか、すべての列挙値をint
として表すことができない場合は、実装定義です。すべての列挙値を表すことができるより大きな整数型。
したがって、これら2つのC++列挙子のサイズを比較すると次のようになります。
enum Test1 {
A1,
B1
};
enum Test2 {
A2,
B2 = 18446744073709551615ULL /* UINT64_MAX */
};
1つ目はデフォルトの整数のサイズ(int
)で、2つ目は64ビット整数のサイズ(long long int
)大きな定数に合わせる。
新しい enum class
C++ 11で導入されたため、ユーザーは列挙型とその定数のサイズを指定できます。定数もスコープされます。これらはC#列挙子と非常によく似ています。
整数が一般的なケースである理由
単純さのために、プログラミング言語の列挙型のデフォルトの選択は整数であると推測します。マシンは実際には数字しか処理できません。テキスト文字列でさえ、プログラムによって特別な方法で解釈される数字の配列です。