問題タブ [pointer-aliasing]
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.
opengl - JOGLミップマップとテクスチャのきらめき
OpenGL 2シーンには壁とレンガのテクスチャがあり、何を設定してもきらめきと点滅を続けます。ズームインすると(そしてテクスチャがはっきりと見えます)、点滅ときらめきが止まります。しかし、ズームアウトしてシーン内を移動すると、点滅ときらめきが非常に顕著になります。これは、レンガの壁のテクスチャコードです。
私がグーグルで調べたところ、これはミップマップが解決する問題のようです。しかし、私の質問は、これをどのように行うのかということです。2サイズの画像のさまざまなパワーすべてのパラメータを作成、ロード、設定する必要がありますか?シーンのズームや移動がちらついたり、きらめいたりしないミップマップを使用してJOGL2テクスチャをロードおよび表示する例を教えてもらえますか?
c++ - C ++でエイリアシングを回避する「正しい」方法は何ですか(コンテナの要素をそれ自体に追加する場合など)?
上記のコードが非常に危険な場合があることを知りました。
(理由が明らかでない場合、あなたは一人ではありません... 私にも明らかではありませんでした。)
私の質問:
それに対処する「標準的な」方法は何ですか?新しい変数を作成し、その後すぐに何かに割り当てるのは、私には少し奇妙に思えます。それに対処するより良い方法はありますか?
このようなエイリアシングの問題に注意するために、どのように自分自身を訓練しますか? どのパターンを探しますか? この状況を認識できません。Cのキーワードについて学んだときにエイリアシングについて学んだ
restrict
だけで、問題が実際に何であるかを理解できるようになったのは今だけです。
編集:
私は答えを受け入れたいと思っていますが、質問の(2)の部分が答えられていないようです. 自分が書いたコードのエイリアシングの間違いを見つけるために、人々がどのような戦略を使用しているのか疑問に思っています。
これまでに思いついた戦略の 1 つは、2 つのパラメーターで同じ値を渡さないようにすることです。(この場合、1 つのパラメーターが暗黙的で、1 つが明示的です。)
他に簡単に気を付けたり注意したりすることはありますか?
c++ - 2 つのオブジェクト内部のエイリアシングを防止する
これに似た関数シグネチャがあります
内部的に、マトリックス クラスにはコンポーネントfloat* data;
を表す がありm x n
ます。a
コンパイラにそれを伝え、出力行列にエイリアスを設定しb
ないようにして、大量のロードストアを実行しないようにしたいと思います。
どうすればそれを行うことができますか?関数シグネチャへのポインターを渡して__restrict
(MSVC で) ポインターをマークできることはわかっていますが、オブジェクトにメモリへのポインターが含まれている参照渡しオブジェクトのイディオムを保持したいと思います。
__restrict
また、オブジェクト参照では機能しないことも知っています。
c - 配列ポインタのエイリアシング - 未定義の動作?
次のコードは未定義の動作を引き起こしますか (エイリアシング違反またはその他による)?
と は同じ型へのポインターになり、相互にエイリアスを許可するため、int *
配列へのポインター型ではなくプレーンを使用する対応するコードは完全に合法であることに注意してください。a
b
編集:これが実際にエイリアシング違反である場合、興味深い結果は、restrict
C99より前のセマンティクスを取得するためのハックだが有効な方法であるように見えることです。次のように:
おそらく、各アドレスで実際の配列にアクセスする必要がある場合は、サイズの違いとして SIZE_MAX-1 や SIZE_MAX-2 などを使用できます。
pointers - gcc C / C ++は、ポインターエイリアシングがないと想定しています
最近、数値計算でFortranがc / c ++よりも高速である主な理由は、ポインターエイリアシングがないためです。
明らかに、restrict
または__restrict__
キーワードを使用すると、ケースバイケースで、特定のメモリ要素にポインタエイリアスがないことを示すことができます。
iccコンパイラには、-fno-alias
エイリアシングが存在しないとグローバルに想定できるオプションがあるようです。gccには-fno-strict-aliasing
、すべてのエイリアシング状況のサブセットにのみ適用されるがあります。
gccにオプションがありますか、または特定の最適化フラグを使用するときにエイリアシングが想定されない場合がありますか?
c++ - ポインタがエイリアスされていないことをCまたはC++コンパイラに伝える方法
私は次のようなポインタの配列を受け取る関数を持っています:
私がコンパイラーに伝えたいのは、ポインターptrs[i]
が相互のエイリアスではなく、配列ptrs[i]
がオーバーラップしないことです。どうすればいいですか?私の裏の動機は、自動ベクトル化を促進することです。
__restrict__
また、?のイテレータと同じ効果を得る方法はありstd::vector
ますか?
c++ - レジスタ キャッシュとは何ですか? const 変数との関係は何ですか?
http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.14から:
言語が禁止されていたとしても
const_cast
、メンバ関数呼び出しでレジスタ キャッシュをフラッシュしないようにする唯一の方法は、エイリアシングの問題を解決することです (つまり、オブジェクトを指すconst
非ポインタがないことを証明することです)。const
レジスタ キャッシュとは何ですか?メンバー関数呼び出しでフラッシュするとはどういう意味ですか?const
c++ - 「他のポインターによってエイリアスされていないポインター」の意味の期間はどれくらいですか?
malloc()
現在、Visual C++ はで装飾されたランタイムに同梱されています__declspec( restrict )
。
MSDN によると、この装飾は、返されたポインターはmalloc()
他のポインターによってエイリアスできないことをコンパイラーに示しています。malloc()
わかりました、実際に異なるポインターを返すための 2 つの後続の呼び出し。でも電話したらどうなるの
この場合、2 つのポインターはまったく同じ場所を指すことができます。これは、 の他のポインターの意味によってエイリアスを作成できないこととどのように相関し__declspec( restrict )
ますか?
c - c でのネストされた構造体と厳密なエイリアシング
次のコードを検討してください。
これは合法的なコードですか、それとも C99 の厳密なエイリアシング規則に違反していますか? 合法/違法の理由を教えてください。
c++ - このコードは C++ 型システムを覆しますか?
C++ でメソッドを持つというconst
ことは、オブジェクトがそのメソッドを介して読み取り専用であることを意味しますが、それ以外の場合でも変更される可能性があることを理解しています。
const
ただし、このコードは参照を介して (つまり、const
メソッドを介して)オブジェクトを変更しているようです。
このコードは C++ で合法ですか?
const
もしそうなら:それは型システムの性質を壊していますか?なぜ/なぜしないのですか?
そうでない場合:なぜですか?
注 1: 例を少し編集したので、回答は古い例を参照している可能性があります。
編集 2: どうやら C++11 も必要ないので、その依存関係を削除しました。
アップデート:
ラムダをコンストラクターの初期化リストに移行しました。これにより、const BreakConst bc;
後で.コンストラクターと呼び出し元は、互いの定義を確認しないとこれを知る方法がありませんが、構築後は未定義の動作になるはずです。bc
bc