問題タブ [reinterpret-cast]
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++ - 変数の生のコピーを実行する単純なキャストは厳密なエイリアシングを壊しますか?
最近、厳密なエイリアシングについてよく読んでいます。a
C/C++ 標準では、次のコードは無効であると述べられています(未定義の動作が正しい) b
。
標準では、char*
何でもエイリアスできると述べているため、char*
変数への書き込みアクセスが行われるたびに、コンパイラーはキャッシュされたすべての値をリロードします。したがって、次のコードは正しいでしょう。
しかし、ポインターがまったく関与していない場合はどうでしょうか? たとえば、次のコードがあり、GCC は厳密なエイリアシングに関する警告をスローします。
私がやりたいのは、の生の値をコピーa
することだけなので、厳密なエイリアシングは適用されません。ここに問題がある可能性がありますか、それとも GCC がそれについて過度に用心深いだけですか?
編集
memcpyを使用した解決策があることは知っていますが、コードが読みにくくなるため、その解決策を使用したくありません。
EDIT2
int32_t b = *reinterpret_cast<int*>(&a);
も機能しません。
解決した
これはGCC のバグのようです。
c++ - ほとんどのポッドデータの reinterpret_cast (レイアウトの互換性は十分です)
と について学ぼうとしていstatic_cast
ますreinterpret_cast
。
私が正しければ、標準 (9.2.18) はreinterpret_cast
、ポッドのデータは安全であると言っています:
を使用して適切に変換された POD 構造体オブジェクトへのポインターは、
reinterpret_cast
その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。[注: したがって、POD 構造体オブジェクト内に名前のないパディングが存在する場合がありますが、適切な配置を実現するために必要に応じて、先頭にはありません。— エンドノート]
私の質問は、これをどの程度厳密に解釈するかです。たとえば、レイアウトの互換性は十分ですか? もしそうでなければ、なぜですか?
私にとって、次の例は、厳密な「POD のみが有効である」という解釈が間違っているように見える例を示しています。
complex_base::m_data
また、保護されている場合 (complex_base
ポッドではないことを意味します) 、何が壊れる可能性がありますか? [編集: どうすれば自分自身を保護し、そのような破損を検出できますか]
レイアウトの互換性で十分であるように思えますが、これは標準が言っていることではないようです。
編集:答えてくれてありがとう。また、 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htmを見つけるのにも役立ちました
c++ - Is std::complex stored in an interleaved fashion?
That is, on disk, if I have an array of std::complex
, is it stored RIRIRIRI
or RRRRIIII
or something else?
My real question is - if I have a structure that I have defined that contains two numbers, can I do a reinterpret cast an array of my structure to use functions that would expect a std::complex
array?
What about memcpy? If both of my structures are floats, that should be ok if they are stored the same?
c++ - reinterpret_castによってintのnullポインタをlong型に変換できますか?
int *pt = 0;
long i = reinterpret_cast<long>(pt);
私は0であることが保証されていますか?これは明確に定義されていますか、それとも実装で定義されていますか?私はc++標準をチェックしましたが、それはそれだけを述べています
データオブジェクトまたは関数へのポインタ(ただし、メンバーへのポインタではない)は、それを含むのに十分な大きさの任意の整数型に変換できます。
この場合、ptはデータオブジェクトを指していません。ルールはこの場合に適用されますか?
c++ - キャストメンバ関数ポインタ
他のコードで使用される基底クラスの引数を受け取るメンバー関数ポインターを使用する必要があります。ええと、単純に、下の例のような[何か]をしたいのです。このコードは正常に動作しますが、そのようなキャストは常に安全なのだろうか? dynamic
ここで行うこともstatic
キャストすることもできません。
c++ - 元のクラスへのポインタをキャストバックすると奇妙な動作になるのはなぜですか?
私のコードでは、データ メンバーとして格納し、必要に応じて元のポインターにvoid*
型キャストする必要があるとします。class
その信頼性をテストするために、テスト プログラム(linux ubuntu 4.4.1 g++ -04 -Wall)を作成しましたが、その動作を見てショックを受けました。
これは単なるテスト プログラムです。私の場合、実際には、ポインターを として保存void*
してから、実際のポインターにキャストすることが必須です (の助けを借りてtemplate
)。ですから、その部分は気にしないでください。上記のコードの出力は、
ただし、をに変更するvoid* p;
と、期待される動作A* p;
が得られます。なぜ ?
別の質問です。(A*&)
それ以外の場合は使用できませんoperator ++
。しかし、それは警告も出します。型がパニングされたポインターを逆参照すると、strict-aliasing rules が壊れます。warning を克服する適切な方法はありますか?
c++ - 特定のオフセットとタイプで生の構造体を再解釈する安全な方法は?
Struct は pragma pack 1 であり、uint、char、short フィールドの束が含まれています...
UInt32 であるため、最初に unsigned char* に reinterpret_cast する必要がありますか、それとも問題ですか?
また、ここでは速度が重要であり、reinterpret_cast は static_cast とは対照的にキャストの中で最速だと思います。
編集: 構造体は、実際には 2 つのシングルバイト フィールドで構成され、その後に約 16 個の他の構造体の結合が続きます。そのうちの 15 個は最初のフィールドとして UInt32 を持ちます。ないものではないことを簡単に確認してから、2 バイトのオフセットに reinterpret_cast を実行します。
c++ - C++ reinterpret_cast よりも 2 連鎖の static_cast を使用する方がよい場合
まず第一に、これは「Why do we have reinterpret_cast in C++ when two chained static_cast can do it's job?」の複製ではありません。.
static_cast
それを達成するために2つのチェーンを使用することさえできない状況を私は知ってreinterpret_cast
います。しかしstatic_cast
、シンプルで読みやすいreinterpret_cast
.
c++ - C++ での Reinterpret_cast の使用
これを持っているだけの簡単な質問:
違いは何ですか:
と
どうもありがとうございました
アントニオ