問題タブ [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.

0 投票する
3 に答える
417 参照

c++ - 変数の生のコピーを実行する単純なキャストは厳密なエイリアシングを壊しますか?

最近、厳密なエイリアシングについてよく読んでいます。aC/C++ 標準では、次のコードは無効であると述べられています(未定義の動作が正しい) b

標準では、char*何でもエイリアスできると述べているため、char*変数への書き込みアクセスが行われるたびに、コンパイラーはキャッシュされたすべての値をリロードします。したがって、次のコードは正しいでしょう。

しかし、ポインターがまったく関与していない場合はどうでしょうか? たとえば、次のコードがあり、GCC は厳密なエイリアシングに関する警告をスローします。

私がやりたいのは、の生の値をコピーaすることだけなので、厳密なエイリアシングは適用されません。ここに問題がある可能性がありますか、それとも GCC がそれについて過度に用心深いだけですか?

編集

memcpyを使用した解決策があることは知っていますが、コードが読みにくくなるため、その解決策を使用したくありません。

EDIT2

int32_t b = *reinterpret_cast<int*>(&a);も機能しません。

解決した

これはGCC のバグのようです。

0 投票する
2 に答える
1342 参照

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を見つけるのにも役立ちました

0 投票する
4 に答える
2028 参照

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?

0 投票する
4 に答える
2334 参照

c++ - reinterpret_castによってintのnullポインタをlong型に変換できますか?

int *pt = 0;
long i = reinterpret_cast<long>(pt);

私は0であることが保証されていますか?これは明確に定義されていますか、それとも実装で定義されていますか?私はc++標準をチェックしましたが、それはそれだけを述べています

データオブジェクトまたは関数へのポインタ(ただし、メンバーへのポインタではない)は、それを含むのに十分な大きさの任意の整数型に変換できます。

この場合、ptはデータオブジェクトを指していません。ルールはこの場合に適用されますか?

0 投票する
4 に答える
8281 参照

c++ - キャストメンバ関数ポインタ

他のコードで使用される基底クラスの引数を受け取るメンバー関数ポインターを使用する必要があります。ええと、単純に、下の例のような[何か]をしたいのです。このコードは正常に動作しますが、そのようなキャストは常に安全なのだろうか? dynamicここで行うこともstaticキャストすることもできません。

0 投票する
3 に答える
855 参照

c++ - 元のクラスへのポインタをキャストバックすると奇妙な動作になるのはなぜですか?

私のコードでは、データ メンバーとして格納し、必要に応じて元のポインターにvoid*型キャストする必要があるとします。classその信頼性をテストするために、テスト プログラム(linux ubuntu 4.4.1 g++ -04 -Wall)を作成しましたが、その動作を見てショックを受けました。

これは単なるテスト プログラムです。私の場合、実際には、ポインターを として保存void*してから、実際のポインターにキャストすることが必須です (の助けを借りてtemplate)。ですから、その部分は気にしないでください。上記のコードの出力は、

ただし、をに変更するvoid* p;と、期待される動作A* p;が得られます。なぜ ?

別の質問です。(A*&)それ以外の場合は使用できませんoperator ++。しかし、それは警告も出します。型がパニングされたポインターを逆参照すると、strict-aliasing rules が壊れます。warning を克服する適切な方法はありますか?

0 投票する
4 に答える
2071 参照

c++ - 特定のオフセットとタイプで生の構造体を再解釈する安全な方法は?

Struct は pragma pack 1 であり、uint、char、short フィールドの束が含まれています...

UInt32 であるため、最初に unsigned char* に reinterpret_cast する必要がありますか、それとも問題ですか?

また、ここでは速度が重要であり、reinterpret_cast は static_cast とは対照的にキャストの中で最速だと思います。

編集: 構造体は、実際には 2 つのシングルバイト フィールドで構成され、その後に約 16 個の他の構造体の結合が続きます。そのうちの 15 個は最初のフィールドとして UInt32 を持ちます。ないものではないことを簡単に確認してから、2 バイトのオフセットに reinterpret_cast を実行します。

0 投票する
6 に答える
1331 参照

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.

0 投票する
2 に答える
555 参照

c++ - void* を介したキャストが機能し、reinterpret_cast が機能しない実際の例を教えてください。

クロスキャスト ( T1*unrelated から unrelated へのキャスト) に関する一連の質問があります。T2*たとえば、 thisおよびthisです。答えは通常、次のようになります。reinterpret_cast実装が定義されており、その後にvoid*続く変換はstatic_cast明確に定義されています。しかし、 を使用したときに何がうまくいかないかの実際の例は見たことがありませんreinterpret_cast

void*キャストスルーが機能する場合とreinterpret_cast機能しない場合の実際の例は何ですか?

0 投票する
3 に答える
741 参照

c++ - C++ での Reinterpret_cast の使用

これを持っているだけの簡単な質問:

違いは何ですか:

どうもありがとうございました

アントニオ