[解決済み】#pragma pack の効果
質問
を説明できる人がいたら教えてください。
#pragma pack
プリプロセッサー文は何をするのか、そしてもっと重要なのは、なぜそれを使いたいのか、ということです。
を調べてみると MSDNページ しかし、経験者の意見をもっと聞きたいと思っていました。以前、コードで見たことがあるのですが、もうどこで見たのかわからないようです。
解決方法は?
#pragma pack
は、構造体のメンバを特定のアライメントでパックするようコンパイラに指示します。 ほとんどのコンパイラは、構造体を宣言すると、メンバの間にパディングを挿入して、メモリ内の適切なアドレス(通常は型のサイズの倍数)にアライメントされるようにします。 これにより、アーキテクチャによっては、適切にアラインされていない変数にアクセスした場合に発生する性能低下(または明らかなエラー)を回避することができます。 例えば、4バイトの整数と次のような構造体があったとします。
struct Test
{
char AA;
int BB;
char CC;
};
コンパイラは、構造体をこのようにメモリ上に配置することを選択できます。
| 1 | 2 | 3 | 4 |
| AA(1) | pad.................. |
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad.................. |
と
sizeof(Test)
は、6バイトのデータしか入っていないのに、4×3=12となります。 最も一般的な使用例としては
#pragma
(私の知る限り)ハードウェアデバイスを扱う場合、コンパイラがデータにパディングを挿入せず、各メンバーが前のメンバーに続くことを確認する必要があります。 この場合
#pragma pack(1)
であれば、上の構造体はこのようなレイアウトになります。
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
そして
sizeof(Test)
は1×6=6となる。
と
#pragma pack(2)
の場合、上の構造体はこのようにレイアウトされます。
| 1 | 2 |
| AA(1) | pad.. |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad.. |
そして
sizeof(Test)
は2×4=8となる。
構造体内部の変数の順番も重要です。
struct Test
{
char AA;
char CC;
int BB;
};
とのことです。
#pragma pack(2)
というように、構造体がレイアウトされます。
| 1 | 2 |
| AA(1) | CC(1) |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
と
sizeOf(Test)
は3×2=6となる。
関連
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] gccの__attribute__((packed))は大丈夫でしょうか?/ #pragma pack unsafe?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】構造体パディングとパッキング