問題タブ [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++ - データの「シリアル化」、バイト順序、および受信側でのアラインメントのためのreinterpret_cast
POD構造体がAと言う場合、私はこれを行います:
受信側のリモートボックスが必ずしも同じハードウェアまたはOSであるとは限らない場合、これを安全に実行して「シリアル化を解除」できますか?
「結果」は常に有効ですか?C ++標準はPOD構造で述べており、reinterpret_castの結果は最初のメンバーを指す必要がありますが、受信側が別のプラットフォームであっても、実際のバイト順序も正しいことを意味しますか?
c++ - ここでreinterpret_castの代わりにstatic_castを使用することが重要なのはなぜですか?
質問者が指摘した
レイモンド、派生クラスの基本クラスサブオブジェクトの位置はISO C ++ 2003標準(10-3、168ページ)に従って指定されていないため、C ++の例は正しくないと思います。また、基本クラスサブオブジェクトは常に次の場所にあると想定します。始まり。Cの例はC++でも問題ないので、私はそれに固執します。
レイモンドは答えた
[コードはこの仮定をしていません。そのため、reinterpret_castではなくstatic_castを使用することが重要です。試してみてください:OVERLAPPEDに仮想メソッドを追加して(vtableが前面に表示されるように)、コンパイラーの動作を観察します。-レイモンド]
彼のコメントを読んだ後、私は推測することができました。この例ではstatic_castを使用しても問題ありませんが、reinterpret_castは問題ありません。reinterpret_castはvtableを変換しないためです。私はそれを正しく理解していますか?
しかし、そこで(reinterpret_castではなく)Cスタイルのキャストを使用すると、それもうまくいかない可能性がありますか?
それを理解するために、より効果的なC++のキャストの説明を読み直しました。しかし、それについての答えはありませんでした。
c++ - 再解釈されたポインタが正しいメモリ位置を指していない
Message.h でこれを取得したとします。
では、 in Message をtypemain.cpp
にキャストしました。ポイントは、レイアウトに従ってメモリにアクセスできることです。m_buffer
Header
Header
はHeader* hdr
と同じメモリ アドレスを指すと想定されMessage msg
、m_primitive
は と同じアドレスにあると想定されHeader* hdr
、m_transNum
は です&m_primitive + 4
。
ただし、これは実際の値です。
m_primitive
完全にランダムな場所をm_transNum
指し、ガベージ値を取得しました! どうすれば起こりますか?reinterpret_cast
異なるタイプのポインターにキャストすることにより、クラスのタイプに応じてレイアウトを変更することになっています。
また、コピーが返された場合、 の値はm_primitive
100 になるm_transNum
はずです。しかし、値は間違っています。memcpy
char* content
msg
constants - 定数を変更する
nextを使って定数を変更できない理由を教えてください。
c++ - Cキャストを介して構造体の最初のフィールドにアクセスすると、厳密なエイリアシングに違反しますか?
このコードは厳密なエイリアシングに違反していますか?
より抽象的に言えば、プリミティブな読み取り/書き込み操作が正しい型である限り、異なる型間でキャストすることは合法ですか?
c++ - 関係のない型の間で reinterpret_cast と virtual
次のコードが機能する理由を誰かが親切に説明してくれませんか? Visual Studio .NET 2008、Cygwin の g++、およびideone.comでテストしました。さらに重要なことは、それが有効かどうかを知りたいということです。A
とB
は無関係なタイプであることに注意してください。
編集:@leftaroundaboutのコメントに従って、コードに次の変更を加えました
プログラムは次のメッセージを出力します。
基本的に、最初の仮想メソッドは、それが何と呼ばれるかに関係なく呼び出されます。
c++ - char * と unsigned char * の間で static_cast できないのはなぜですか?
どうやらコンパイラはそれらを無関係な型と見なしているため、reinterpret_cast
必須です。なぜこれがルールなのですか?
c++ - reinterpret_cast と STATUS_ACCESS_VIOLATION
C++ と関数を試しているときに、aを areinterpret_cast
に変換しようとしたところ、STATUS_ACCESS_VIOLATION 例外が発生しました。short
string
私の理解では、アプリケーションのプロセスに割り当てられていないメモリを使用しようとしました。
このような禁止されたメモリ アクセスの試みにどのように注意すればよいでしょうか? 私の短い価値が含まれているこの作品だけを再解釈するにはどうすればよいでしょうか?
c++ - ARCを有効にしてreinterpret_castを使用する
ARC対応のObjective-Cプロジェクトにライブラリのヘッダーファイルをインクルードしました。
ライブラリがARCを有効にしてコンパイルされていないことは知っていますが、問題はライブラリのヘッダーファイル、特に次の行にあります。
このエラーが発生します:
このエラーを修正することは可能ですか?
ヘッダーファイル全体はここにあります:http://puu.sh/sTrH
c++ - Strict aliasing and std::array vs C-style array
When compiling the following code with gcc 4.7 (g++-mp-4.7 (GCC) 4.7.0 built with MacPorts on OS X) I get seemingly contradictory results.
The compiler does not complain when I try to reinterpret and dereference a section of an std::array
as an uint32_t
but it does when using a C-style array.
Example code:
Compiler command is:
Why are they treated differently?