問題タブ [constantfolding]

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 投票する
1 に答える
78 参照

c++ - const の値を変更する「未定義性」のメカニズム

const が変更されたときに何が起こるかは、一部の C 標準 (おそらく 99 ?) では未定義です。しかし、ある学生がコードを提示してくれたので、それを修正しました。

定数変数のアドレスについて特別なことは何もわかりませんa&aとが同じであることを確認したbので、コンパイラは微妙に他の場所を指していません。しかし、代入*bしてもconst値は変わりません。

私は最適化を実行していません。-gデバッグするフラグを指定してコンパイルし、コードにステップインすると、期待どおりの結果が得られます (変数のメモリ位置がa変更されます)。ただし、以下に示すコードは の更新された値を反映していませんa

これは、最適化なしで、デバッグモードでも一時がレジスタに配置されているということですか?

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

c# - uint と int の減算と一定の折り畳み

この興味深い質問に基づいて: Nicholas Carey's answerに記載されているように、int と uint を追加し、一定の折り畳みをいじくり回すと、一見一貫性のないコンパイラの動作に遭遇しました。

次のコード スニペットを検討してください。

ここで、コンパイラは に正しく解決kされlongます。この特定の動作は、前述の質問への回答で説明されているように、仕様で明確に定義されています。

私にとって驚くべきことは、リテラル定数または一般的な定数を扱うときに動作が変化することです。Nicholas Carey の回答を読んで、動作に一貫性がない可能性があることに気付いたので、確認して十分に確認しました。

kこの場合は に解決されUint32ます。

定数を扱うときに動作が異なる理由はありますか、それともこれはコンパイラの小さいながらも不幸な「バグ」(より適切な用語の欠如) ですか?

0 投票する
0 に答える
149 参照

f# - F# はいつ定数折りたたみを行いますか?

インライン化された数学ユーティリティ関数をいくつか書いたところですが、テスト中に気づいたのは

float 演算子を評価せずに元の値と定数値のみを挿入し、printAn (18, 0, 0)いくつかの をインスタンス化して (ただし、デバッグ モードほど多くはありません)、完全に折りたたまれます。(3.0f, 0.0f, 0.0f, 3.0f)0.0f3.0fTuple

Release(デフォルト構成で、4.5 フレームワークをターゲットとする Visual Studio 2013 Update 4 を使用します。TRACE定数を定義解除しても違いはないようで、どちらも違いはありませんopen Unchecked。)


問題が発生した場合、IL ウィービングを使用して式を折りたたむのは簡単なはずなので、パフォーマンスへの影響についてはあまり心配していませんが、コンパイラが正確に定数を折りたたむことができることに興味があります。

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

haskell - GHC で一定の​​折り畳みの最適化を無効にする方法はありますか?

GHC -O1 最適化を使用していくつかの Haskell ソース コードをコンパイルする必要がありますが、定数折りたたみの最適化は無効になっています。ただし、GHC のマニュアルには、定数の折りたたみを切り替えるための最適化フラグが見つかりませんでした。他の最適化を維持しながら、これをオフにすることは可能ですか?

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

c - C での最小保証定数フォールディング

質問

Cで行われる一定の折り畳みについて保証があるかどうか、私は興味があります.

私が見たところ

私には評判が不明なサイトのこのリンクは、率直なコメントをしています。

すべての C コンパイラは、マクロ展開後に存在する整数定数式を折りたたむことができます (ANSI C 要件)。

しかし、たとえば The C Programming Language, second edition (ANSI C のすべての詳細を説明するために完全に更新されたと思います) には何も表示されません。しかし、関連する単語への参照のインデックスをチェックした後、これを約束するものは何も見つかりませんでした. 特に38ページと209ページは、コンパイル時に評価できる任意の式を、定数を使用できる場所で使用できると述べているため(十分に知識があれば、おそらくいくつかの制限があります)、そのような式は次のように述べています。 " may " はコンパイル時に評価されますが、"will"/(いくつかの同義語) ではありません。

この C89 最終案を検索しました。"folding" と "folded" という単語では値の結果が得られず、"constant expression" で検索すると 63 件の一致が生成され、そのうちの約半分を調べました。興味のある主要な部分は基本的に本と同じようです ( 「かもしれない」の代わりに「できる」という言葉を使用していますが、この文脈ではそれらは同義です)。

これらはどちらも、すべての ANSI C コンパイラが基本的な定数折りたたみ機能を備えている必要があることを論理的に強く暗示しているように思われますが、同時に、定数式を式を計算するコードにコンパイルすることに対する厳しい禁止事項はないようです。実行時 (このような実装でも、定数式の利点が得られます。これは、コンパイラが定数式を一度計算すると、値が変化しないと想定するコードを生成できるためです。また、そのような実装は、特定の基礎となるアーキテクチャ (たとえば、いくつかの RISC アーキテクチャ) の制限によって強制される可能性があります。可能な値を初期化するために 2 つの命令を使用するか、メモリ位置からそれらをロードする必要があります)。

この C99 最終ドラフトも簡単に検索しましたが、"folding" は価値のない結果を 1 つ得ましたが、"folded" と "constant" にはそれぞれ 100 以上の一致があり、現在クロールする時間を割り当てることができませんでした。

動機

これらのマクロは、ビットをいじるコードでよりセマンティック/意図を明確にするために作成しました。

..wherenは常に整数リテラルです。私は安心したいのですが、「大丈夫です。リモートで重要な使用中のすべての C コンパイラがこれらの定数を折りたたんでくれます」という安心できる声を聞きたいです。(追記: ビットが 0 番目または 1 番目のビットから始まるUCHAR_NTH_BIT_mかのように動作するかどうかについて、別の質問をしました。できれば適切な場所で行います。)

そして、はい、一番下のものは別のマクロに変えることができます。たとえば、コードでたまたま必要なマクロを#define UCHAR_1ST_BIT_m (unsigned char )1介して#define UCHAR_3RD_BIT_m (unsigned char )4、または必要に応じて多くのマクロを作成できます-そして、それらのどれが優れているかについては未定ですが、おそらく議論の余地があります。優れたペダンティック言語弁護士タイプの C プログラマーになるためには、一番上のものを正確に避けることはできません (これらの DSP/組み込みおよび古代のメインフレーム C 実装でコードが正しいことを実行することを確認する必要があります)。

0 投票する
0 に答える
126 参照

babeljs - babel 6 と定数の折り畳み/伝搬

本番モードでコードから定数を削除する正しい方法を誰かが提案できますか? 私はすでにbabel-plugin-constant-foldingbabel-plugin-dead-code-eliminationをテストしましたが、どちらもbabel 6ではなくbabel 5でのみ機能します。

例:

私は得ることを期待しています:

または、より良い(正直なところ、このレベルの最適化は必要ありません。文字列の連結なしですべてのIDをその値に置き換えるだけで十分です):

ただし、次のみを取得します。

誰かがbabelプラグインの正しいシーケンスを提案してくれますか?

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

gcc - 16 ビット ターゲット アーキテクチャで定数フォールディング中のオーバーフロー

16 ビット ターゲット プラットフォームで avr-gcc を使用しています

私はこのようなことをしたいと思います:

予想どおり、MIN_UPDATES_PER_REV*MAX_RPM が 0xf4240 に評価されるため、オーバーフロー エラーが発生します。

-Woverflow の利点は失われますが、定数を 32 ビットに強制し、折り畳み後に uint16_t に戻すとうまくいきます。

一定の折り畳み中に gcc に大きな中間値を処理させることはできますか?

プリプロセッサに定数の折りたたみを強制することはできますか?

知っておくべきベスト プラクティスはありますか?