C结构中的对齐/填充

C结构中的对齐/填充,c,C,我正在检查我的项目中的代码 以下结构定义如下: typedef struct { ULONG gatewayIp; UBYTE status; UBYTE align; UWORD info; ULONG magicTemp; uword stationCode; } GatewayStatus; 我的问题是,为什么我们在上述结构中处于中间位置 我在下面的链接中提到,编译器负责对齐。 不管上述结构如何,我都把我的问题概括起来 在什么情况

我正在检查我的项目中的代码

以下结构定义如下:

typedef struct {
    ULONG gatewayIp;
    UBYTE status;
        UBYTE align;
    UWORD info;
    ULONG magicTemp;
    uword stationCode;
} GatewayStatus;
我的问题是,为什么我们在上述结构中处于中间位置

我在下面的链接中提到,编译器负责对齐。

不管上述结构如何,我都把我的问题概括起来 在什么情况下,我们必须以编程方式对齐,而编译器将为我们这样做

如果两台机器具有不同的endian类型,即一台m/c为big endian,另一台为low endian,则填充是否需要

请澄清我的问题


谢谢

我可以想象,它的存在是为了明确在那个位置将有一个pad字节。如果将来有人想添加字节字段,这可能很有用


另一个场景是,如果在没有对齐要求的系统上使用结构(这通常是8位体系结构的情况),但仍应具有与大型计算机相同的布局。在这种情况下,结构定义需要显式填充。

默认情况下,编译器将数据对齐以获得最大可对齐字节数,这取决于机器。对于linux,默认情况下GCC编译器执行4字节对齐


如果我们想对齐8、16、32等等。。。字节,我们需要显式地告诉编译器。

这个结构来自什么上下文?它不会碰巧在一个使用这个结构的二进制转储进行I/O的库中,是吗?我认为这是一个坏例子,因为它与一个专用产品相关,开发人员决定以这种方式定义这个结构;可能字(2字节)对齐。这和编译器的配置无关。如果所有内容都显示C,C++标记是什么?下面的代码类型是什么?< ULUG> <代码>,<代码> uByth<代码>,<代码> uWord < /C> >和<代码> uWord < /C>您的平台上这些类型的大小是多少?编译器将在结构元素之间放置它认为必要的任何填充。它将最大限度地减少浪费的空间,同时避免因数据访问不一致而导致的速度减慢。