問題タブ [strict-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.
c++ - float を int に、またはその逆にタイプパニングする適切な方法は何ですか?
以下のコードは、いくつかのビット ハックによって高速な逆平方根演算を実行します。このアルゴリズムはおそらく 1990 年代初頭に Silicon Graphics によって開発され、Quake 3 にも登場しました。 より詳しい情報
ただし、 GCC C++ コンパイラから次の警告が表示されます。
static_cast
そのような状況では、reinterpret_cast
またはdynamic_cast
代わりに使用する必要がありますか?
c - Berkley Sockets、エイリアシング ルールを破っていますか?
gccでコンパイルして未定義の動作を取得することなく、厳密なエイリアシングをオンにしてBSDソケットを使用できますか?
このコード行は、私が知る限り厳密なエイリアシング ルールを破っています (gcc は同じ警告を出します)。それで、strictaliasing を有効にせずに O3 モードでソケットを使用する計画 b はありますか? もちろん、ルールを破ることなく?または、すべてのシステム/コンパイラで実行できる独自のソケット システムを実行する必要がありますか?
c - Undefined-Behavior の最高の状態で、それは -boundary break ですか? - ポインタ演算が悪い?それともエイリアシングを無視しますか?
私は現在、未定義の動作に焦点を当てたc99で数週間働いています。ルールを尊重しながら、奇妙なコードをテストしたかったのです。結果は次のコードでした。
(変数名を許してください、私は道化師を食べました)
したがって、このコードは未定義の動作です。私が所有していないメモリ領域にアクセスしていないか、初期化されていないメモリにアクセスしているかにかかわらず、異なる結果が得られます。(私の知る限り)
最初の重要なルールは、ポインターを追加または減算することは許可されていないため、配列の境界を離れることができませんでした。しかし、ポインターを整数にキャストすることは許可されています。そこで、必要に応じて計算できますね。
私の2番目の仮定は、有効なアドレスをポインターに割り当てることが許可されているため、この計算されたアドレスをポインターに割り当てるための有効な操作でした。私は char ポインターで動作しているので、char* は何でもエイリアスできるため、厳密なエイリアス規則が破られることもありません。
それで、これがUBを引き起こすという、どのルールが破られていますか?
単一の変数も「配列」として理解されるべきであり、私はこの規則を破っていますか?
— 配列オブジェクトまたは整数型へのポインタの加算または減算は、同じ配列オブジェクトまたはその直後を指していない結果を生成します (6.5.6)。
もしそうなら、私もこれをしてもいいですか?
結果はほぼ確実に未定義の動作になるためです。MSVC2010でコンパイルすると、予想される「U」が出力されますが、clangとgccを使用するfreeBSDでは、最適化レベルに応じてかなり面白く、毎回異なる結果が得られます。(行動が定義されている限り、私の目にはあるべきではありません)。
では、この鼻のドラゴンの原因は何か考えはありますか?
c++ - FFTW : エイリアシング規則を破るのを防ぐには?
std::complex<double>
タイプを使用するコードがあります。FFTWマニュアルより:
変数がある場合は、
complex<double> *x
経由で FFTW に直接渡すことができますreinterpret_cast<fftw_complex*>(x)
。
ただし、コードでこれを行うと:
私は得るdereferencing type-punned pointer might break strict-aliasing rules [-Wstrict-aliasing]
。この警告を解決するには?ありがとう !
c++ - 厳密なエイリアシング規則に違反しない C++ の共有メモリ バッファ
C99 の厳密なエイリアシング規則を破ることなく、共有メモリ バッファを実装するのに苦労しています。
一部のデータを処理するコードがあり、操作するために「スクラッチ」メモリが必要であるとします。次のように書くことができます:
次に、スクラッチ バッファーも必要とする他の機能を実行する別の関数があります。
問題は、操作中に foo() と bar() が何度も呼び出される可能性があり、あちこちにヒープ割り当てがあると、パフォーマンスとメモリの断片化の点で非常に悪い場合があることです。明らかな解決策は、適切なサイズの共通の共有メモリ バッファを一度割り当ててから、BYOB スタイルの引数として foo() と bar() に渡すことです。
2 つの質問があると思います:
- エイリアシング ルールに違反していない共有共通スクラッチ メモリ バッファを実装するにはどうすればよいですか?
- 上記のコードは厳密なエイリアシング ルールに違反していますが、エイリアスを使用しても「害」はありません。したがって、正常なコンパイラで (最適化された) コードが生成され、それでも問題が発生する可能性はありますか?
ありがとう
c++ - C++: ユニオンを介して厳密なエイリアスをバイパスし、__restrict 拡張機能を使用する
一般的な厳密なエイリアシングまたは -O2/-O3 最適化をそれぞれ維持しながら、厳密なエイリアシング要件を特別に設計されたケースに合わせて調整することが可能かどうか疑問に思います。
より正確に言えば、必要な場合は、厳密なエイリアシングを無名共用体を使用してバイパスできます (こことここで指摘されているように):
このようなキャストによって取得されたポインターを使用__restrict
すると、コンパイラーでエイリアスなしの最適化が再び有効になるのでしょうか (または、そのようなポインターとそのすべてのコピーが常に潜在的にエイリアシングされていると見なされるのでしょうか)。このような:
c - アラインされていないバッファで構造体を使用する方法
私のネットワーク アプリでは、受信したバッファーで、オフセットを既知の構造体へのポインターとして使用したいと考えています。構造体のすべてのフィールドを memcpy() で 2 回 (rx/tx) コピーするのは大変です。私の gcc 4.7.2 (オプション: -O3) が cortex-a8 で実行されていることを知っています。したがって、彼は unaligned int にアクセスできます。多くの構造体、または大きな構造体を持つ可能性があると仮定します。それを行う最良の方法は何ですか?