質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

2回答

18353閲覧

__attribute__ ((packed)) 指定に反してアライメント調整が適用される

yamma_ma

総合スコア21

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

1グッド

3クリップ

投稿2016/03/13 06:05

以下のような構造体の定義を行ったとします。

C

1#include <glib.h> 2 3typedef struct _St1 4{ 5 guint32 v1; 6 guint16 v2; 7 gchar reserved[6]; 8 gint16 v3; 9 gint32 v4; 10 gint32 v5; 11 gint16 v6; 12 gint16 v7; 13} __attribute__ ((packed)) St1; 14

この場合、St1のサイズは26バイトになってほしいのですが、実際には28バイトとなり、v3の後に余計な2バイトが不可されてしまうようです。

コードのコンパイルはMinGW-w64 32bitのGCC 5.3.0で行い、上記の事象を確認しました。Ubuntu 15.10(x86)上のGCC 5.2.1でコンパイルした場合には、26バイトとなっていました。

何かお気づきの点がありましたらご指摘ください。

Chironian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

いただいた回答を元に調べてみたところ、gcc_struct属性、ms_struct属性があるとわかりました。該当の構造体にのみgcc_struct属性をつけることでピンポイントで回避できるようです。

C

1typedef struct _St1 2{ 3 guint32 v1; 4 guint16 v2; 5 gchar reserved[6]; 6 gint16 v3; 7 gint32 v4; 8 gint32 v5; 9 gint16 v6; 10 gint16 v7; 11} __attribute__ ((gcc_struct, packed)) St1;

投稿2016/03/14 11:17

編集2016/03/14 11:53
yamma_ma

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

MinGW 5.2.0 x64とx32の両方で同じ現象を確認しました。
どうもMinGWの不具合のようです。3年前に報告されてました。
Bug 52991 - attribute packed broken on mingw32?
良く読めば詳しいことが分かりそうですが、すいません読んでません。
このバグ報告の最後のコメントに、-mno-ms-bitfieldsフラグをつけたら良いと書いてあるようです。
このオプションを付けるとちゃんとパックされました。

投稿2016/03/13 09:23

編集2016/03/13 09:34
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamma_ma

2016/03/13 23:30

情報ありがとうございます。 -mms-bitfieldsをオフにするのが回避策ですか……。若干不安も感じますが対策を検討してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問