問題タブ [pragma-pack]
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 - #pragmaパック効果
#pragma pack誰かがプリプロセッサステートメントが何をするのか、そしてもっと重要なことに、なぜそれを使いたいのかを私に説明できるかどうか疑問に思いました。
いくつかの洞察を提供するMSDNページをチェックしましたが、経験のある人からもっと多くのことを聞きたいと思っていました。私は以前にコードでそれを見たことがありますが、もうどこを見つけることができないようです。
c++ - C++ #pragma パック
次のステートメントは実際に何を行い、どのような効果がありますか?
c++ - ネットワークプログラミングでの`#pragmapack`とは何ですか?
チュートリアルをダウンロードしましたが、ヘッダーファイルにこれらの行が含まれています。これに関連するチュートリアルやリファレンスを提供していただければ幸いです。
c - gcc の __attribute__((packed)) / #pragma pack は安全ではありませんか?
C では、コンパイラは構造体のメンバーを宣言された順序でレイアウトし、メンバー間または最後のメンバーの後にパディング バイトを挿入して、各メンバーが適切に配置されるようにします。
gcc は言語拡張機能 を提供します__attribute__((packed))。これは、パディングを挿入しないようコンパイラーに指示し、構造体メンバーの位置合わせが正しく行われないようにします。たとえば、システムが通常、すべてのintオブジェクトに 4 バイト アラインメントを要求する場合、構造体メンバーが奇数のオフセットに割り当てられる__attribute__((packed))可能性があります。int
gcc ドキュメントの引用:
`packed' 属性は、'aligned' 属性でより大きな値を指定しない限り、変数または構造体フィールドが可能な限り最小のアラインメント (変数に 1 バイト、フィールドに 1 ビット) を持つ必要があることを指定します。
明らかに、この拡張機能を使用すると、データ要件は小さくなりますが、コードが遅くなります。これは、(一部のプラットフォームでは) コンパイラが一度に 1 バイトずつ位置合わせされていないメンバーにアクセスするコードを生成する必要があるためです。
しかし、これが安全でない場合はありますか? コンパイラは、パックされた構造体の整列されていないメンバーにアクセスするために、常に正しい (ただし遅い) コードを生成しますか? すべての場合にそうすることさえ可能ですか?
c++ - iphoneのプラグマパック(プッシュ)
と の中に構造が#pragma pack(push,1)あり#pragma pack(pop)ます。これが iphone コンパイラで適切に機能するかどうか、およびこれらのマクロ以外に他の副作用があるかどうかを知りたいです。
ありがとう、ラックスヴァン。
c++ - Visual Studio でのプラグマ パック ディレクティブのスコープ
#pragma packVisual C++でのアラインメントの範囲は? API リファレンス
https://msdn.microsoft.com/en-us/library/vstudio/2e70t5y1%28v=vs.120%29.aspx
には次のように書かれています。
pack は、プラグマが表示された後の最初の構造体、共用体、またはクラスの宣言で有効になります
したがって、次のコードの結果として:
私は期待しました:
しかし、私は受け取った:
だからこそ、私は少し驚いており、あなたが提供できる説明に本当に感謝しています.
c++ - __attribute__((__packed__)); の違いは何ですか? および #pragma pack(1)
Linux で完全に動作するコードを Windows Visual C++ に移植しています。Linuxに次のコードがあります:
Windowsでエラーが発生しています:
を使用してこのエラーを修正できるかどうか疑問に思っています
それらの間に違いはありますか?この属性に Linux と Windows で使用できる構文はありますか?
visual-c++ - #pragma pack(8) はどのように機能しますか?
構造の整列とパッキングは初めてです。理解したつもりでしたが、予想外の結果がいくつか見つかりました (以下を参照)。
構造のアライメントに関する私の理解は次のとおりです。
型は通常、そのサイズの倍数であるメモリ アドレスに配置されます。
適切な配置を容易にするために、必要に応じてパディングが追加されます
構造体の末尾は、最大要素の倍数になるようにパディングする必要があります (配列へのアクセスを容易にするため)。
この#pragma packディレクティブは基本的に、型のサイズに基づいて配置する一般的な規則をオーバーライドできます。
驚いたことに、VS 2015 x86 では sizeof(SPack8) == 24 です。d が 8 バイトのアドレスにアラインされていないようです。
誰かが何が起こっているのか/私が誤解していることを説明してもらえますか?
ありがとうございました!
c - C - なぜ #pragma pack(1) は 6 ビットの構造体メンバーを 8 ビットと見なすのですか?
#pragma pack(1)フィールドを定義し、6-bitそれを と仮定すると、間違った動作に行き詰まりました8-bit。この質問を読んで問題を解決しましたが、まったく役に立ちません。
Visual Studio 2012では、文字structを保存するために次のように定義しました。Base64
でサイズを取得しましsizeofたが、結果は期待したものではありません:
結果 :4
私はそれが得られることを期待していました3(なぜなら6 * 4 = 24、24ビットは3バイトだからです)
1-bit代わりにフィールドでテストし、正しいサイズ(1バイト)を得たイベント:
実際、なぜ6-bitと仮定する8-bitの#pragma pack(1)ですか?