3

私はこの問題を調べようとしましたが、うまくいく解決策を見つけられませんでした。私のコンパイラは#pragmapack(push)#pragma pack(2)を無視しており、__属性__((aligned(2)、packed))も問題を解決しません。スタックは8バイトで整列されており、一部の構造を2バイトで整列するように変換したいと考えています。-fpack-structは機能しますが、すべての構造に影響します。

#pragmaパックを使用したいのですが。

SDK 13.3 eclipse IDE GCC#4.1.2でザイリンクスmicroblazeをプログラミングしています

コンパイラがプラグマパックを無視する原因がわからないと思います。警告をオフにしたくありません。使用したいと思います。

#pragma pack(push)
#pragma pack(2)
struct _Size_Test
{

  union
  {
    struct{
        int8    x;
        int8    y;
     };
     int16    z;
  };
}Size_Test;
#pragma pack(pop)

sizeof(Size_test)= 4(2である必要がある場合)

属性の追加((aligned(2)、packed))は機能しません

struct _Size_Test
{

  union
  {
    struct{
        int8    x;
        int8    y;
     };
     int16    z;
  };
}Size_Test _attribute_((aligned(2),packed));
4

2 に答える 2

0

構造体のサイズが4バイトである理由は、xフィールドとyフィールドを含む内部構造体によるものです。指定した2バイトのパッキングプラグマを使用すると、これらの各フィールドは2バイトに整列され、ユニオンの最長のメンバーが4バイトの長さになります。

コンパクトさが重要な場合は、明示的なパディングフィールドと組み合わせて1バイトのパッキングを使用します。この特定の例では、パディングも必要ありません。

#pragma pack(push, 1)

struct _Size_Test
{
    union
    {
        struct
        {
            int8 x;
            int8 y;
        };

        int16 z;
    };
} Size_Test;

次のスニペットは、明示的なパディングがどのように機能するかを示しています。

#pragma pack(push, 1)

struct _Size_Test
{
    union
    {
        struct
        {
            int8 x;
            int8 pad1;
        };

        int16 z;
    };
} Size_Test;
于 2013-03-19T19:36:26.293 に答える
0

構造体に次のようなものを使用できます。

struct __packed__
{
    char* member_one;
    int *member_two;
    .... 
} my_struct;

これを使用して、標準の配置を抑制しようとすることもできます。

int *__unaligned my_int_pointer;

この助けを願っています。

よろしく。

于 2012-08-04T00:27:57.377 に答える