2009-03-04 13 views
6

この見積もりをhereから、ページの下部にチェックしてください。 constsが行うのに対し、彼らは最終的に出力されたオブジェクト/ライブラリ/実行ファイル内の任意のスペース を消費しませんconst vs enum in D

列挙型は、その中でconsts異なる(私は約const sがinvariantの同様に適用される引用されたコメントを信じています)。

value2はリテラルとして扱われ、オブジェクト・ファイルには表示されませんしながら、だから、明らかにvalue1は、実行可能ファイルを肥大化されます。戻るCで

const int value1 = 0xBAD; 
enum int value2 = 42; 

++私はいつもこれは、定数を離れて最適化することができませんでしたレガシー上の理由から、古いコンパイラのためだったと仮定。しかし、これがまだDに当てはまる場合は、この背後に深い理由があるはずです。誰でも知っている理由は?

答えて

4

(また2.0がまだ完了していないことに注意してください)。その列挙子には場所がありません。彼らは同一性のない価値としては重要ではありません。

enumはD2の新機能です。最初に新しい変数を定義します。それは左辺値ではありません(あなたもそのアドレスを取ることはできません)。

enum int a = 10; // new in D2 

私は私の貧しいDの知識を信頼できる場合

enum : int { a = 10 } 

のようなものです。したがって、ここにaは左辺値ではありません(場所はなく、住所は取得できません)。しかし、constは、のアドレスを持っています。グローバル変数(正しいD言語であるかどうかわからない)がある場合、コンパイラは通常、モジュールがその変数にアクセスできるか、またはそのアドレスを取ることができないか分からないため、最適化できません。したがって、ストレージを割り当てる必要があります。

ローカルのconstを持っていれば、コンパイラはそのコンパイラがそのアドレスに興味があるかどうか、あるいは誰もがその値を取るかどうかをコンパイラが知っているので、 。

1

enum値が式で "インライン"で使用されるように聞こえますが、constで実際に記憶域が使用され、それを参照する式がメモリ記憶域から値をロードします。

この音は、C#でのconstとreadonlyの違いと似ています。前者はコンパイル時定数であり、後者は実行時定数です。これは、アセンブリのバージョン管理に影響を与えました(読み取り専用を参照するアセンブリはコンパイル時にコピーを受け取るため、参照されたアセンブリが別の値で再構築されても値が変更されません)。

3

私は良いコンパイラ/リンカーはまだ定数を削除する必要がありますと思う。列挙型の場合、実際には仕様で保証されています。違いは主に意味論の問題です。 (:素晴らしい、D2もfloats and stringsをサポート編集)ただ、C++のように、Dでの列挙型は、「リテラル保存された整数」であるように思わ

+1

しかし、コンパイラは常に関連するすべてのソースを持つことを前提としています。 – larsivi

+0

サードパーティのライブラリにそのconst変数へのアクセス権を与えたい場合はどうすればよいですか?もしそれがconstにされたクラスインスタンス全体であれば? – Marenz

+0

私は "compiler/* linker *"と言った。さらに、Dはコンパイル時の変数の値を(とにかくフォールディングなどのために)見ることができなければなりません。したがって、物理的にどこかに格納する点が少なくなります。とにかく利用可能です。 (私は以前の実行からオブジェクトコードを内部的に逆アセンブルするコンパイラは認識していません) – FeepingCreature

4

実際の質問。 enum/constはC++と同じDです答えられていないようです。残念ながら、この選択の理由はまったくありません。私はこれがC++の意図しない副作用であり、事実上のパターンになったと信じています。Dでは、同じパターンが必要でした。そしてWalter Brightは、C++のように、その場所から来る人たちが何をすべきかを認識するようにしなければならないと決めました...実際、このIMHOばかげた決定の前に、このユースケースのためにenumの代わりに。

+2

'enum'はマニフェスト定数を意味することは残念です。しかし、Dは明示的に壊れているものを変更するだけの点になり、他のすべてはアルゴール語の確立された規範に従います。あなたが本当にすべてに出かけたら、代入/等価、関数名の前にリストされた戻り値、構造体/集合体など、奇妙なキーワードと構文を見つけることができました。 –

2

enumの実際の目的は、単一のマニフェスト定数をサポートするように構文的に拡張されています。私が理解するところでは、Dテンプレートの専門家Don Clugstonがテンプレートで狂ったことをしていました。コンパイラはconst変数の内部データ構造を作成していたので、長いビルド時間、馬鹿馬鹿しいコンパイラのメモリ使用量などに走り続けました。列挙型と比較したconst/immutable変数の重要な点の1つは、const/immutable変数は左辺値であり、そのアドレスを取ることができるということです。つまり、コンパイラには余分なオーバーヘッドがあります。これは通常問題ではありませんが、実際に複雑なコンパイル時のメタプログラムを実行しているときは、const変数を最適化してもコンパイル時に大きなオーバーヘッドになります。