問題タブ [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++ - ポインターが既に const とマークされている場合、C でヘルプを制限しますか?
疑問に思っていること: ポインターに制限を追加すると、ポインターが別のポインターのエイリアスではないことをコンパイラーに伝えます。次のような関数があるとします。
result
コンパイラが とオーバーラップする可能性があると想定する必要がある場合a
は、毎回 を再フェッチする必要があります。ただし、a
とマークされconst
ているように、コンパイラは a が固定されていると想定することもできるため、一度取得すれば問題ありません。
質問は、このような状況で、restrict を使用するための推奨される方法は何ですか? コンパイラがa
毎回再フェッチすることは確かに望ましくありませんが、ここでどのようrestrict
に動作するかについての良い情報を見つけることができませんでした.
c - C99 'restrict' キーワードの現実的な使い方?
いくつかのドキュメントと質問/回答を閲覧していて、それが言及されているのを見ました。簡単な説明を読みましたが、それは基本的に、ポインターが他の場所を指すために使用されないというプログラマーからの約束であると述べています。
これを実際に使用する価値がある現実的なケースを誰かが提供できますか?
c++ - C++ での restrict キーワードの意味は何ですか?
C++ での restrict キーワードの意味は何ですか?
関数に与えられた2つ以上のポインタが重複していないということですか? 他にどういう意味ですか?
c - 制限を使用する場合と使用しない場合
大まかな理解はしていますが、restrict
いくつかの細かい点を明確にしたいと思っています。あるバッファから null で終わる文字列を読み取り、別のバッファに URL エンコードされたバージョンを書き出す関数があります。関数には次のシグネチャがあります (現在は なしrestrict
):
unencoded
私のヌル終了ソース文字列です。encoded
宛先バッファはandで表されますencodedEnd
。ここで、 はバッファ内encoded
の最初のものを指し、バッファの後の最初の charを指します。つまり、関数はsを書き込みますが、 が指す場所は含みません。これは基本的な/イテレータです。 C++ STL 規則に精通している場合は、ペアにしてください。char
encodedEnd
char
encodedEnd
begin
end
この関数に追加restrict
する場合、最初の 2 つのパラメーターにのみ適用する必要があります。
または、3つのパラメーターすべてに追加することで理解できない利点がありますか?
入力バッファーと出力バッファーを作成するとrestrict
、それらがオーバーラップしていないことをコンパイラーが認識するのに役立つことがわかります。しかし、最後のパラメーター ,encodedEnd
は出力バッファーの末尾をマークするためにのみ使用されるため、restrict
ここでコンパイラーにとって実際には何の助けにもならないと思います (ただし、不要なノイズを追加する以外は、害はないと思いますが)関数宣言に)。
c - pre-c99によるrestrict-edness
このコードを考慮すると、VC9はエイリアシングを検出しません:
明らかな修正は、一時的なものを使用することです:
これは標準的な動作ですか?私は、コンパイラーが、そのように言われない限り、両方のポインターがおそらくエイリアス化されていると想定することを期待していました。
c++ - 制限キーワードを使用したエラー
次の例では:
次のエラーが表示されます。
gcc 3.4 を使用して、-std=c99 でコンパイルします。
何か案は?
c - ポインタへのポインタに関するC99の「制限」のセマンティクスは何ですか?
restrict
私は多くの行列演算を行っており、C99 のポインター修飾子を利用したいと考えています。
次のように、マトリックスをポインターへのポインターとして設定して、添字を簡単に付けられるようにしたいと思います。
さて、行列乗算関数
引数の両方のポインターを制限付きとして修飾する必要がありますか? int *restrict *restrict
これは有効な構文ですが、 と異なる動作をするかどうかを判断するのに苦労していint **restrict
ます。
次に、ポインターが適切に制限されている場合、A[0][col*nrows + row]
未定義を介して要素にアクセスしていますか? (つまり、コンパイラは、そのようなの値に対してのみ行列にアクセスすると想定しますか?) それとも、単に一貫性を保つ必要がありますか?A[col][row]
row
row < nrow
c - 人間は制限修飾子から何を作ることができますか?
C99restrict
キーワードを正しく取得した場合、ポインターをそれで修飾すると、ポインターが参照するデータが、エイリアシングによってコンパイラーの背後で変更されないことが約束されます。
対照的に、私がconst
修飾子を理解する方法は、特定のオブジェクトがコードを書いている人間の背後で変更されないというコンパイラーによって強制されたドキュメントです。コンパイラーは副作用としてヒントを得るかもしれませんが、プログラマーとして私は本当に気にしません。
restrict
同様の方法で、関数プロトタイプの修飾子を、ユーザーが呼び出し中に排他的アクセスを保証する(「エイリアシングを回避する」、またはおそらくより強力なもの)という要件と見なすのが適切でしょうか?「ドキュメンテーション」として使用する必要がありますか?
restrict
また、(そうであるように)ポインターが指すデータではなく、ポインターを修飾するという事実に理解すべきことがありconst
ますか?
編集:私は当初、それがスレッデッドコードに影響を与える可能性があると信じていrestrict
ましたが、これは間違っているように思われるので、読者を混乱させないように、質問からスレッドへの参照を削除します。
c++ - 制限キーワードはgcc/g ++で大きな利点を提供しますか?
restrict
gcc /g++実際でC/C ++キーワードを使用すると、実際に(理論上だけでなく)パフォーマンスが大幅に向上するかどうかについて、数値や分析を見たことがありますか?
私はその使用を推奨/軽蔑するさまざまな記事を読みましたが、どちらの側の議論も実際に示している実数に出くわしたことはありません。
編集
これは正式にはC++の一部ではありませんが、一部のコンパイラでサポートされており、 ChristerEricsonによるその使用法を強く推奨restrict
する論文を読んだことがあります。
c++ - C/C++ __restrict 型
エイリアスがないことを意味する typedef の整数/浮動小数点型を使用して定義する方法はありますか?
同等のもの(ただし、プリミティブな構造):
関連する質問として、ポインターのエイリアス/エイリアスなしを決定するものをgccに尋ねることは可能ですか?