1

c++構造体にデータをパックしようとしています。

私の構造体のレイアウトは次のとおりです。

struct structName
{
  int16_t member1;
  int32_t member2;
  uint32_t member3;
  uint32_t member4;
  uint32_t member5;
  etc
}__attribute__((packed));

を使用offsetof($structname, $membername)すると、データの正しいオフセット(0,2,6,10,14。。。)が返されますが、メンバー名でデータにアクセスすると、4バイトのオフセット(0,4,8、 12,16 ..。)構造体がパックされていないかのように。

} __attribute__((packed));

構造体をパックする正しい方法は?。。

4

1 に答える 1

6

更新:mydogisboxは次のように書いています:

記録のために、、__attribute__((packed))および#pramga pack(1)すべて#pragma pack(push, 1)が機能しました。

__attribute__((packed))サポートされているgcc拡張機能です。

#pragma pack(...)clangのドキュメントには、ディレクティブもサポートされていると記載されています。

clangは、Microsoft VisualC++の拡張機能を実験的にサポートしています。これを有効にするには、-fms-extensionsコマンドラインオプションを使用します。これは、Windowsターゲットのデフォルトです。サポートが不完全であることに注意してください。Microsoft拡張機能を有効にすると、特定の構成要素(__declspecおよびMicrosoftスタイルのasmステートメントを含む)がサイレントに削除されます。

clangは、#pragma packレコードレイアウトを制御するためのMicrosoft機能をサポートしています。

ソース:http ://clang.llvm.org/docs/UsersManual.html

言うだけ:

#pragma pack(1)
struct my_struct {
    int16_t x;
    // etc.
};

それが機能するかどうかを確認します(Windowsを使用していない場合はでコンパイルし-fms-extensionsます)。

上記はすべて非標準の拡張機能であり、新しいC ++ 11標準には新しいalignasキーワードがあります:http://en.cppreference.com/w/cpp/language/alignas

struct alignas(1) my_struct {
    int16_t x;
    // etc.
};

しかし、そのサポートはまだ少し大ざっぱです。

于 2012-06-04T21:50:24.633 に答える