問題タブ [function-attributes]
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.
gcc - const gcc 関数属性とグローバル const 変数
GCC ドキュメントから:
多くの関数は、引数以外の値を調べず、戻り値以外には何の効果もありません。関数はグローバルメモリを読み取ることができないため、基本的に、これは上記の純粋な属性よりもわずかに厳密なクラスです。
const
私の質問は、グローバル値がグローバル メモリとしてカウントされるかどうかです。そうだと思いますが、不変として明示的にマークした値が、ここで可能な最適化を無効にする可能性があるのは奇妙に思えます。
例えば:
の使用はConstantModulusValue
、私の理解では、この関数をマークしてはならないことを意味しますが、これもconst
奇妙に思えます。これをマークすることには危険がありconst
ますか?
c - ネストされた関数に対する GCC 属性の影響
関数属性は、関数宣言に対してのみ指定できます (定義ではありません)。そのため、ネストされた関数の属性を指定できません。例えば:
このような場合、「hot_nested_function」は「hot」として最適化されますか?
UPD:ばかげた例では、gcc (手段およびより高い最適化レベル) は、 (ネストされた関数の場合) のgcc -O1
有無にかかわらず、関数呼び出しをその本体に置き換えます。__attribute__ ((hot))
ネストされた関数について思い出させるものは何もありません。
UPD2: gcc.git/gcc/tree-nested.cによると、親関数の参照、外部ラベルのジャンプなどを解決します。次の段階で、ネストされた関数は、インライン化機能を備えた独立した関数に変換されます。しかし、親関数の属性についてはまだ不明です。彼らは入れ子に適用しましたか?
python - 関数属性を再割り当てすると「到達不能」になります
dict
関数呼び出しの結果を関数属性としてキャッシュする、単純な小さなデコレータがあります。
キャッシュを空にする可能性を追加したいと思います。したがって、dynamic_programming()
関数を次のように変更します。
ここで、この小さなものを使用してフィボナッチ数関数を実装するとします。
しかし、キャッシュをクリアすると、奇妙なことが起こります。
または (新しい Python カーネルが実行されている状態で) 逆の方法で実行します。
clear()
キャッシュに最初にアクセスした後、キャッシュが何らかの形で「到達可能」でないのはなぜclear()
ですか。
(ちなみに、キャッシュを正しくクリアする解決策を知っています。f.cache.clear()
割り当ての代わりに呼び出しを行うと、期待どおりに機能します。割り当ての解決策が失敗する理由{}
に興味があるだけです。)
c++ - GCC - 関数属性にマクロを使用すると、「初期化子がありますが、型が不完全です」というエラーが発生する
いくつかの単純な美化されたstruct
s を含むヘッダー ファイルがいくつかあり、その中に純粋な仮想メソッドが定義されています。コードは Visual Studio 2015 を使用する Windows で正常にコンパイルされますが、GCC が動かなくなります。まず、コード:
コード リスト
インポートされたヘッダー ファイルでinterface
は、次のように定義されていstuct
ます。
そしてAPI_ABSTRACT
、何の役にも立たない単なるマクロです:
これinterface
typedef
は、私が制御できない継承されたコードの一部であり、エクスポートする API 関数を制限するために、Windows と Linux でカスタム属性を定義API_ABSTRACT
できるように配置されています。これは VS2015 でビルドされますが、Linux ではビルド エラーが発生します。
行を変更すると:
私がそれが翻訳されていると私が推測するものに:
コードは Linux で正常にコンパイルされます。でコンパイルしgcc -E -dD
て、「前処理済み」のソースを画面にレンダリングしてtypedef
との#define
置換を確認しましたが、ファイルの出力のみが表示され、.cpp
ヘッダー ( .h
) ファイルは表示されないようです。
質問
GCC でコンパイルしようとすると、このコードが機能しないのはなぜですか?
ありがとうございました。
編集#1
からの出力gcc -E
は、問題のある行を次のように示しています。
したがって、犯人はAPI_ABSTRACT
何も評価しないマクロにあるようです。