問題タブ [compile-time]

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.

0 投票する
2 に答える
354 参照

python - Python :(明示的な)文字列パラメータはパフォーマンスを低下させますか?

使用しないパラメータを常に取得する関数があるとします。

今、この呼び出しを検討してください

これは、実行時に構築されないが、バイナリに直接コンパイルされるパラメータとして文字列を提供します(そうだといいのですが)。

問題は、たとえば、この方法でsomeFuncを数千回呼び出すと、「未使用の文字列」への参照が常に渡されますが、プログラムの速度が低下するのでしょうか。

私の素朴な考えでは、「未使用の文字列」への参照は「定数」であり、someFuncへの呼び出しが発生したときにO(1)で使用可能です。だから私は「いいえ、それはパフォーマンスを損なうことはありません」と言うでしょう。

以前と同じ質問:「私は正しいですか?」

いくつかありがとう:-)

0 投票する
1 に答える
194 参照

asp.net - ASP.NET リソーシング: ResourceProvider がコンパイル時と実行時にいつ呼び出されるかを検出する

私の ASP.NET Web アプリは、SQL Server データ ストアに基づくカスタム リソース プロバイダーを利用しています。私が理解しているように、暗黙的なリソース割り当ては、コンパイル時にリソース プロバイダーを呼び出して、指定されたリソース キーに対してリソース式を生成する必要があるかどうかを判断します。その結果、私のビルド プロセスは、必要なリソース キーを含むライブの最新データベースに依存するようになりました。

それ自体は必ずしも問題ではありません。問題は、クエリ文字列パラメーターによって決定される多くのデータベースの 1 つにアプリが接続することです (ひどい設計ですが、残念ながら私は今のところそれで立ち往生しています)。明らかに、コンパイル時にクエリ文字列がないため、リソース プロバイダーはデータベースにアクセスできません。リソース プロバイダー (より具体的には、リソース プロバイダーの下流のコード) がコンパイル中に呼び出されたことを判断して、事前に定義されたデータベースを参照できるようにすることはできますか?

今のところ、HttpContext.Current == null の場合、特定のデータベースにデフォルト設定しています。これは正常に機能しますが、このロジックはデータ アクセス層に存在する必要があり、データ アクセス層が System.Web を参照するという考えは絶対に嫌いです。より良い解決策はありますか?

0 投票する
3 に答える
801 参照

c - ANSI-Cのコンパイル時ルックアップアレイの作成?

以前のプログラマーは、値をその場で計算するのではなく、実行時のCPUサイクルを節約するために、大きなルックアップテーブル(定数の配列)を生成することを好みました。彼は、個々のルックアップテーブルごとに一意のカスタムVisual C ++プロジェクトを作成することでこれを行いました。これにより、配列ファイルが生成され、完全に別個のANSI-Cマイクロコントローラー(ルネサス)プロジェクトに#includeされます。

このアプローチは、彼の元の計算の仮定には問題ありませんが、入力パラメーターを変更する必要がある場合は面倒になり、すべてのVisual C ++プロジェクトを再コンパイルし、それらのファイルをANSI-Cプロジェクトに再インポートする必要があります。私がやりたいのは、Visual C ++ソースをANSI-Cマイクロコントローラープロジェクトに直接移植し、コンパイラーに配列テーブルを作成させることです。

だから、私の質問は:ANSI-Cコンパイラはコンパイル時にルックアップ配列を計算して生成できますか?もしそうなら、私はそれについてどうすればいいですか?

よろしくお願いします!

0 投票する
5 に答える
1335 参照

c# - メンバーが戻った後に実行が停止することをC#コンパイラに納得させる

これは現在可能ではないか、それが良い考えでさえあるとは思いませんが、それは私が今考えていたものです。C#プロジェクトの単体テストにMSTestを使用しています。私のテストの1つで、次のことを行います。

このコードをコンパイルするにはinstance、宣言時またはcatchブロック内のいずれかに値を割り当てる必要があります。代わりに後で行うこともできreturnますが、コンパイラがこの時点以降は実行を続行できない ことを知っAssert.Failているだけでなく、それでも回避策です。私の知る限りでは、実行がそれを超えて進むことを許可することは決してないので、値なしで使用されることは決してありません。それでは、なぜそれに値を割り当てなければならないのですか?をのようなものに変更すると、コードは正常にコンパイルされます。例外により、初期化されていない状態で使用されるポイントに実行を進めることができないことがわかっているためです。Assert.FailinstanceAssert.Failthrow exinstance

逆に、テストを失敗させたくなく、不確定としてマークした場合はどうなりますか?Assert.Inconclusiveの代わりに行うことができますFail。コンパイラがその後実行が続行されないことを知っていれば便利です。

それでは、実行をどこに進めることができるかについての実行時とコンパイル時の知識の場合ですか?Assert.FailC#が、メンバー(この場合はメンバーが戻った後は決して実行を許可しない)を言う方法があるのは合理的でしょうか?多分それはメソッド属性の形であるかもしれません。これはコンパイラにとって有用ですか、それとも不必要な複雑さですか?

外部ユニットテスト

人々はこれがユニットテストを書くためのばかげた方法であると[正当に]指摘しているので、ユニットテストの領域外で私の質問を考えてみてください。

ここでは、への呼び出しを例外のスローに置き換えることができる可能性がsomeMethodThatWillNeverReturnあります。おそらく、やるべきことがあれば、例外のコンストラクターでそれを行うことができます。

Resharperは知っています

return後にAssert.Failまたはを追加するとAssert.Inconclusive、Resharperreturnは灰色になり、「コードはヒューリスティックに到達不能です」というツールチップが表示されます。

0 投票する
5 に答える
31594 参照

c++ - C ++のsizeofは、コンパイル時または実行時に評価されますか?

たとえば、このコードスニペットの結果は、コンパイラマシンまたはマシン実行可能ファイルのどちらのマシンで機能するかによって異なります。

0 投票する
1 に答える
1140 参照

c++ - 文字列リテラルを使用したコンパイル時のメタプログラミング

単純なコンパイル時のメタプログラミングで実際に実行できるコードを書いています。コンパイル時のシンボルとして空の構造体タグを使用するのが一般的な方法です。いくつかの実行時構成要素でタグを装飾する必要があります。静的変数は(メタプログラミングを有効にするための)唯一の方法のようですが、静的変数にはグローバル宣言が必要です。このScottMyersの提案(Effective C ++の第3版から)を回避するために、静的変数をクラス変数としてではなく関数内で宣言することによって静的変数の初期化を順序付けることについて頭に浮かびました。

そこで、次のコードを思いつきました。私の仮説は、実行時に文字列リテラルを使用できるコンパイル時のシンボルを作成できるようにするというものです。依存するテンプレートクラスを初期化する前にランタイムフィールドにデータを入力する限り、これが正しく機能することを願っています。。

編集: コミュニティウィキを作成しました。

0 投票する
5 に答える
871 参照

c++ - コンパイル時のメタプログラミング手法で実装されたデザインパターンを使用しているライブラリはどれですか?

テンプレートメタプログラミングなどのコンパイル時の手法を使用して実装されたデザインパターンを使用するライブラリを知っている人はいますか?Lokiがいくつか実装していることは知っていますが、他のライブラリを見つける必要があります。

0 投票する
6 に答える
22156 参照

delphi - Delphi で現在のプロシージャ/関数の名前を取得する方法 (文字列として)

プロシージャ/関数内で、現在のプロシージャ/関数の名前を文字列として取得することは可能ですか? コンパイル時に展開される「マクロ」があると思います。

私のシナリオは次のとおりです。レコードが与えられた多くの手順があり、それらはすべてレコードの有効性をチェックすることから始める必要があるため、レコードを「バリデータ手順」に渡します。バリデータ プロシージャ (すべてのプロシージャで同じもの) は、レコードが無効な場合に例外を発生させ、例外のメッセージにバリデータ プロシージャの名前ではなく、バリデータを呼び出した関数/プロシージャの名前を含めたい手順(当然)。

つまり、私は持っています

その後

代わりに次のようなものを書くことができれば、エラーが発生しにくくなります

その後、コンパイラは {$PROCNAME} に遭遇するたびに、「マクロ」を文字列リテラルとして現在の関数/プロシージャの名前に置き換えるだけです。

アップデート

最初のアプローチの問題は、エラーが発生しやすいことです。たとえば、コピーと貼り付けが原因で間違ってしまうことがよくあります。

またはタイプミス:

または一時的な混乱:

0 投票する
6 に答える
20977 参照

c++ - C++ テンプレートを使用してコンパイル時間を短縮する方法

C++ アプリの一部を古い C 型配列の使用からテンプレート化された C++ コンテナー クラスに変更中です。詳細については、この質問を参照してください。ソリューションは非常にうまく機能していますが、テンプレート化されたコードに小さな変更を加えるたびに、非常に大量の再コンパイルが発生するため、ビルド時間が大幅に遅くなります。テンプレート コードをヘッダーから取り出して cpp ファイルに戻す方法はありますか?これにより、マイナーな実装の変更によって大幅な再構築が発生することはありません。