問題タブ [restrict-qualifier]
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.
c++ - restrict キーワードに関するコンパイラ エラー
重複の可能性:
C++ での restrict キーワードの意味は何ですか?
QMCPACKを OS X 10.8.2にインストールしようとしていますが、次のようなエラーがたくさん発生します。
私は restrict キーワードに慣れていませんが、これは他の人のためにコンパイルされる一般的なコードであるため、他の種類の問題である可能性があると感じています。
そのコードの完全なコンテキストは次のとおりです。
c - strtolのエイリアス引数
C11(n1570)strtol
に従って宣言する方法は次のとおりです。§ 7.22.1.4
私の知る限り、restrict
キーワードは、左辺値によって参照されるオブジェクトが*nptr
、それまたはそれから直接派生した値でのみアクセスされることを意味します。
ただし、多くのプログラマー、さらには経験豊富なプログラマーもstrtol
、次のように使用します。
その場合**endptr == **&p == *p == *nptr
、、、および動作は未定義です。正しいですか?
objective-c - const __restrict ポインターを変更できるのに、typdef されたバージョンを変更できないのはなぜですか?
注: Xcode の最新バージョンに同梱されている目的の C コンパイラを使用しています。
これが合法である理由は次のとおりです。
ただし、typedef を使用すると、私がすべきだと思うことを実行します。
では、typedef の場合と何が違うのか、何がわからないのでしょうか? __restrict について読むと頭が痛くなり、ここでそれが重要なのかどうかさえわかりません。
c++ - 変数を自動制限として定義する
私が理解restrict
しているように、関数内の特定のデータへの唯一の参照としてポインターをマークします。私は通常、関数パラメーターで使用されているのを目にしますが、これも有益なようです:
(したがって、コンパイラは変更が変更a
されないことを認識しb
、追加の最適化を行うことができます)。
get_some_string
非常に複雑な型を返す場合は、auto
キーワードを使用するのが最善のようです。
しかし、auto restrict
トリガーを使用すると、「制限にはポインターが必要です」というエラーが発生します。では、これらをどのように組み合わせることができますか?
コメントにあるように、restrict
C++ の標準キーワードではありません。#define restrict __restrict__
プロジェクトに、GCC で動作する行があることを忘れていました。
c - 互換性のある型と引数の型修飾子
これら 2 つの宣言の型は互換性のある型ですか?
または同様に:
問題をカバーする標準で何かを見つけるのに苦労しています。私は主に、C のバージョンまたは使用中の他のライブラリのバージョンに応じて、実際の型が restrict 修飾された引数を持つ可能性がある、restrict キーワードを省略して、手動で関数のプロトタイプを作成することが有効かどうかというトピックに関心があります。
c++ - C++: ユニオンを介して厳密なエイリアスをバイパスし、__restrict 拡張機能を使用する
一般的な厳密なエイリアシングまたは -O2/-O3 最適化をそれぞれ維持しながら、厳密なエイリアシング要件を特別に設計されたケースに合わせて調整することが可能かどうか疑問に思います。
より正確に言えば、必要な場合は、厳密なエイリアシングを無名共用体を使用してバイパスできます (こことここで指摘されているように):
このようなキャストによって取得されたポインターを使用__restrict
すると、コンパイラーでエイリアスなしの最適化が再び有効になるのでしょうか (または、そのようなポインターとそのすべてのコピーが常に潜在的にエイリアシングされていると見なされるのでしょうか)。このような:
c++ - 関数を Visual C++ で副作用がないものとしてマークする
次の (少し想像された) 例を考えてみましょう。
mystrlen()
副作用がなく、古い結果をmystrlen(text)
2 回呼び出す代わりに再利用できることをコンパイラに伝えることができれば、非常に便利です。
それについてのドキュメントには何も見つかりません。restrict
または、その差異の1つも機能していないようです。すべての最適化 (switch /Ox
) をオンにした出力コードを見ると、コンパイラが実際に 2 つの呼び出しを生成していることがわかります。両方の機能を 1 つのモジュールに入れても、そうです。
これに対する解決策はありますか、またはVC ++に解決策がないことを誰かが確認できますか?
c - 配列で制限を使用しますか?
特定の配列にアクセスする唯一の方法は myarray[index] を使用することであることを C99 コンパイラに伝える方法はありますか? 次のように言います。
restrict を使用することで、range1 と range2 をエイリアスしないことを約束しましたが、関数内で宣言された配列に対して同じことを行うにはどうすればよいでしょうか?