繁体   English   中英

Pragma Pack Ignored和__attribute __((aligned(2),packed)); 没有任何影响

[英]Pragma Pack Ignored and __attribute__ ((aligned (2), packed)); does not have any effect

我一直试图查找这个问题,但没有找到一个有效的解决方案。 我的编译器忽略了#pragma pack(push)#pragma pack(2)和__ attribute __((aligned(2),packed))也没有解决问题。 堆栈是8字节对齐的,并希望将某些结构转换为2字节对齐。 -fpack-struct有效但它会影响所有结构。

我想用#pragma pack。

我在SDK 13.3 eclipse IDE GCC#4.1.2中编写了一个xilinx微型编程器

我想我不明白是什么让编译器忽略了Pragma包..我不想关闭警告我想用它。

#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));

你可以在你的结构中使用这样的东西:

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

您还可以尝试使用以下方法来抑制标准对齐:

int *__unaligned my_int_pointer;

希望这有帮助。

问候。

结构大小为四个字节的原因是由于包含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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM