内存对齐,windows上的gcc编译器

33qvvth1  于 2022-11-13  发布在  Windows
关注(0)|答案(1)|浏览(196)

有没有人遇到过__attribute((packed))不能被windows平台上的gcc编译器识别的情况?GCC版本6.3.0

typedef unsigned int   u32;
typedef          int   s32;
typedef unsigned short u16;
typedef          short s16;
typedef unsigned char  u8;
typedef          char  s8;

typedef struct{
    u16 limit;
    u32 base;
}__attribute__ ((packed)) gdt_register_t;

对于__attribute__ ((packed))gdt_register_t的大小应该是6,但在我的环境中,它是8,我认为问题是__attribute__ ((packed))不起作用。
有人建议我使用标准的固定大小uint16_t、uint32_t,但结果仍然是8

#include <stdio.h>
#include <stdint.h>

typedef unsigned int   u32;
typedef          int   s32;
typedef unsigned short u16;
typedef          short s16;
typedef unsigned char  u8;
typedef          char  s8;

typedef struct{
    u16 limit;
    u32 base;
}__attribute__ ((packed)) gdt_register_t;

size_t bar(void)
{
    return sizeof(gdt_register_t);
}

typedef struct{
    uint16_t limit;
    uint32_t base;
}__attribute__ ((packed)) gdt_register_t1;

size_t bar1(void)
{
    return sizeof(gdt_register_t1);
}

看起来我不应该轻易使用gcc -c abc.c来编译文件,需要一些其他的参数吗?

jgovgodb

jgovgodb1#

这可能不是你的主要问题,但这是一个如此重要的事情,我认为它需要得到妥善解决。
您正在使用:

typedef int s32;

这在很多层面上都是错误的。一个int并不保证是32位的。它实际上甚至不保证至少是32位的。你不仅做出了一个虚假的承诺,这可能是未来bug的根源,你也跳过了为此目的而存在的类型。永远不要使用那个typedef。
如果你想要一个32位的有符号整数,那么就使用int32_t。如果你真的想要,你也可以使用int_fast32_tint_least32_t,但这些都不是很常见。也有无符号的版本和其他大小的。
除此之外,我不知道为什么它给你的大小为8。我尝试了你的代码,得到的结果是6。https://onlinegdb.com/2bCZM7AUZ
我想你可以尝试使用__attribute__((packed, aligned(X))),其中X是对齐方式。尝试将其设置为1或2。

相关问题