問題タブ [compile-time-constant]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - コンパイル時に評価されないインターフェイスで定義された最終的な静的文字列 - Android
2 つのクラスと 1 つのインターフェイス (たとえばDatabaseModel
、、、LocalStore
および InternalModelInterface) があります。それらは次のように定義されています。
私が経験している問題は、実行時に を呼び出すとlocalStore.function()
、null と同様に temp に null が割り当てられることInternalModelInterface.COLUMN_PARAM1
です。これは理にかなっていますか?InternalModelInterface.COLUMN_PARAM1
コンパイル時に評価してインライン化すべきではありませんか?
これは Android アプリケーション用です。前もって感謝します。
混乱を解消するために、さらに説明します。
DatabaseModel
JSON 応答が解析されると、クラスのオブジェクトがインスタンス化されます。クラスで定義された定数DatabaseModel
は、JSON 応答で検索するキーを表します。
はInternalModelInterface
、デバイスのローカル (キャッシュ) データベースで使用される列名を定義します。いくつかの理由 (SQLite ではキーが不正な列名であることなど) から、キーを列名として再利用していません。
私が単純なクラスだけでなくインターフェイスを使用している理由は、インターフェイスが、3 番目のクラスである LocalStore によって実装する必要がある必須メソッドも指定するためです。
c - Cの16進定数は、L接尾辞にもかかわらず符号なしです。
これは簡単な質問ですが、混乱しています。私はかなり典型的なgcc警告を持っていますが、これは通常簡単に修正できます。
warning: comparison between signed and unsigned integer expressions
0x80000000Lのように、最上位ビットの16進定数がある場合は常に、コンパイラーはそれを符号なしとして解釈します。たとえば、このコードを-Wextraでコンパイルすると、警告(gcc 4.4x、4.5x)が発生します。
私は特に定数に接尾辞を付けているのに、なぜこれが起こっているのですか?
c# - C#-DateTime.MinValueとMaxValueがコンパイル時定数ではないのはなぜですか?
ユーザーが実際に値を指定したかどうか(MinValueの指定が無効であった)を確認するために、メソッドのオプションの日付パラメーター(デフォルトはMinValue)が必要でしたが、明らかにコンパイルではないため、許可されていません-時定数。
MSDNのページによると、「この定数の値は、0001年1月1日の00:00:00.0000000に相当します。」
では、なぜそれがコンパイル時定数ではないのでしょうか?また、許可されているInt32.MinValueを渡すのとはなぜ違うのですか?
objective-c - Objective-c定数静的NSArray
私は Java プログラマーで、Objective-C を学んでおり、変数の実装に問題があります。これは、Java の静的最終クラス変数と同様です。クラス PolygonShape では、クラス内外からアクセスできる多角形タイプの NSDictionary が必要です。私はすでに次のことを試しました:
PolygonShape.h:
PolygonShape.m:
しかし、PolygonShape のインスタンスを初期化せずに他の場所 (main.m など) からポリゴン タイプにアクセスしたい場合、変数 polygonTypes は nil になるため、これでは十分ではありません。だから私は正常に動作する静的関数を使用しました:
PolygonShape.m:
これで問題ありませんが、これを行う最善の方法は何ですか?また、クラスメソッドで初期化せずに NSDictionary に extern を使用することは可能ですか? (そして、singeltonクラスについては知っていますが、PolygonShapeクラス内にポリゴンタイプの定数配列が本当に欲しいです)。
c++ - AVR / Linux GCC C++ プロジェクトの共通定数
Linux + AVR Arduino プロジェクト用のソフトウェアを作成しています。明らかに、作業全体が Eclipse のいくつかのプロジェクトに分割されています (私は Arduino IDE を使用していません)。これらすべてのプロジェクトに共通の、ほとんどが文字列の定数を使用したいと思います。また、マイクロコントローラーの RAM を節約する必要があるため、コンパイル時の定数が必要です。どのように実装するのが最善ですか?私の考えは、これらの定数用に別のヘッダーのみのプロジェクトを作成することです。
使用:
次のように文字列定数を連結できるようにしたいので、十分ではありません。
私も使いたくないですdefine
。使用したい:
これは文字列の連結を可能にし、(AFAIK) コンパイル時ですが、avr プロジェクトでは std::string を使用できません。または、ここで間違っていて、使用方法がわかりません。
どんな助けでも感謝します。
assembly - NASM の equ と db の違いは何ですか?
それらは同じで、代わりに使用できるラベルを作成してい2
ますか? そうでない場合、各申告書の長所と短所は何ですか? それらは同じ意味で使用できますか?
clojure - Clojureのコンパイル時定数
この質問は純粋に「精神的なマスターベーション」から来ており、おそらく実用的な価値はありません。
を使用してClojureで値を定義した場合def
、コンパイラーはコンパイル時に値を評価し、実行時まで待たないように誘導できますか?
マクロを定義できると思いますが、呼び出し構文は少し厄介になります。
これも機能しますが、それでも醜いです:
また、Clojureがコンパイル時に定数式を評価することも理解しています(または信じています)。
私はCommonLispを学んでいますが、Common Lispはユーザー定義のリーダーマクロをサポートしているので#$
、コンパイル時に次のシンボルを評価するリーダーマクロ(のようなもの)を定義できます。
ちなみに、その構文はマクロ呼び出しよりも「きれい」ではありません。
Clojureにコンパイル時に定数変数を評価させ、参照を実際の値に置き換えるにはどうすればよいですか?すでにそうしていますか?
誰かがクヌースの法則(「時期尚早の最適化はすべての悪の根源である」)を引用し始める前に、Clojureコンパイルの内部をよりよく理解するためにこの質問をします。
c++ - クラスのヘッダーファイル内でconstdoubleを定義するにはどうすればよいですか?
私のクラスのヘッダーファイル内で、私は次のことを試みて、コンパイラの苦情を受けています:
実際にこれをどのように行うことになっていますか?
c++ - constexpr オーバーロード
constexpr は、C++11 での有用性が制限されているように感じます。これは、そうでなければ同じシグネチャを持つが、1 つが constexpr で、もう 1 つが constexpr でない 2 つの関数を定義できないためです。つまり、たとえば、constexpr 引数のみを取る constexpr std::string コンストラクターと、非 constexpr 引数用の非 constexpr std::string コンストラクターがあれば非常に便利です。もう 1 つの例は、state を使用してより効率的にすることができる、理論的に複雑な関数です。これを constexpr 関数で簡単に行うことはできないため、次の 2 つの選択肢があります。constexpr 以外の引数を渡すと非常に遅い constexpr 関数を使用するか、constexpr を完全に放棄するか (または 2 つの別個の関数を記述し、ただし、どのバージョンを呼び出すべきかわからない場合があります)。
したがって、私の質問は次のとおりです。
標準準拠の C++11 実装で、引数が constexpr であることに基づいて関数のオーバーロードを許可することは可能ですか?それとも標準を更新する必要がありますか? 許可されていない場合、意図的に許可されていませんでしたか?
@NicolBolas: を にマップする関数があるとしenum
ますstd::string
。これを行う最も簡単な方法は、 myenum
が から0
に進むと仮定して、結果で満たされたn - 1
サイズの配列を作成することです。n
を作成して戻り時にstatic constexpr char const * []
構築する(関数を呼び出すたびにオブジェクトを作成するコストを支払う) ことも、 を作成して検索した値を返すこともできます。関数を呼び出します。より良い解決策は、コンパイル時にメモリ内に を作成することだと思われますが (現在 で行われているのと同様)、これを行う唯一の方法は、コンストラクタに引数があることを警告することです。std::string
std::string
static std::string const []
std::string
std::string
char const *
constexpr
コンストラクター以外の例については、要件を無視できる(したがって非関数を作成する) ことができれば、より効率的な関数を作成std::string
できる例を見つけるのは非常に簡単だと思います。次のスレッドを考えてみてください: constexpr の質問、なぜこれら 2 つの異なるプログラムが g++ でこれほど異なる時間で実行されるのですか?constexpr
constexpr
引数を指定して呼び出した場合、関数呼び出しを完全に最適化するコンパイラよりも優れた結果fib
を出すconstexpr
ことはできません。しかし、引数なしで呼び出す場合はfib
、メモ化 (状態が必要) などを実装する独自のバージョンを呼び出して、引数constexpr
を渡した場合のコンパイル時間と同様の実行時間を取得したい場合があります。 constexpr
.
java - コンパイル時の定数と変数
Java 言語のドキュメントには次のように書かれています。
プリミティブ型または文字列が定数として定義されていて、その値がコンパイル時にわかっている場合、コンパイラはコード内のすべての定数名をその値に置き換えます。これは、コンパイル時定数と呼ばれます。
私の理解では、コードがある場合は次のようになります。
次に、コンパイラはx
、コード内のすべての出現箇所をリテラルに置き換え10
ます。
ただし、実行時に定数が初期化されるとします。
コンパイル時の定数と比較して、パフォーマンスが低下することはありますか (無視できる程度であっても)?
別の質問は、以下のコード行かどうかです。
コンパイラによってコンパイル時定数と同じように扱われますか?
最後に、回答から私が理解していることは次のとおりです。
final static
コンパイル時の定数を意味します- 定数であることを意味します
final
が、実行時に初期化されます static
実行時に初期化されることを意味します- without
final
は変数であり、定数として扱われません。
私の理解は正しいですか?