[解決済み】構造体パディングとパッキング
2022-04-01 23:19:19
質問
考えてみてください。
struct mystruct_A
{
char a;
int b;
char c;
} x;
struct mystruct_B
{
int b;
char a;
} y;
構造体の大きさはそれぞれ12と8である。
これらの構造は、水増しされていますか、それとも詰め込まれていますか?
パディングやパッキングはいつ行われるのですか?
解決方法は?
パディング
アライメント
構造体のメンバを、"natural" アドレスの境界線に合わせる - と言うことです。
int
のメンバーはオフセットを持つことになり、そのオフセットは
mod(4) == 0
32ビットプラットフォームでは パディングはデフォルトでオンになっています。これは、最初の構造体に次のような "gaps"を挿入します。
struct mystruct_A {
char a;
char gap_0[3]; /* inserted by compiler: for alignment of b */
int b;
char c;
char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;
パッキン
一方、GCCでは、コンパイラがパディングを行うことはできません。これは、明示的に要求されなければなりません。
__attribute__((__packed__))
ということで、以下のようになります。
struct __attribute__((__packed__)) mystruct_A {
char a;
int b;
char c;
};
というサイズの構造体を生成します。
6
32ビットアーキテクチャの場合。
ただし、不整列メモリアクセスが可能なアーキテクチャ (x86 や amd64 など) では速度が低下します。 ストリクトアライメントアーキテクチャ SPARCのような。
関連
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み】異なるサイズの長方形を、かなり最適な方法で可能な限り小さな長方形に詰め込むには、どのようなアルゴリズムが使用できるだろうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み] struct has no member named
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】.axfファイルとは何ですか?