2012-04-26 78 views
0

我正在浏览项目中的代码。C结构中的对齐/填充

以下是结构定义如下:

typedef struct { 
    ULONG gatewayIp; 
    UBYTE status; 
     UBYTE align; 
    UWORD info; 
    ULONG magicTemp; 
    uword stationCode; 
} GatewayStatus; 

我的问题是,为什么我们在上面的结构之间对准英寸

我教编译器负责对齐如下面的链接中提到的。 http://vcfaq.mvps.org/lang/11.htm

我概括我的问题,不论上述结构 下,我们有什么方案,以编程方式对齐,并会做什么场景编译器,我们呢?

如果两台机器有不同的endian类型,即一个m/c是big endian而另一个是low endian,那么是否需要填充?

请澄清我的问题。

谢谢!

+0

这个结构来自哪个上下文?它不会发生在使用此结构的二进制转储进行I/O的库中,是吗? – Cameron 2012-04-26 06:16:37

+0

我认为这是一个糟糕的例子,因为它与开发人员决定以这种方式定义这种结构的专用产品有关;也许单词(2字节)对齐。这与编译器的改变无关。 – 2012-04-26 06:18:49

+0

如果所有内容都显示C,那么C++标记是什么? – 2012-04-26 06:25:08

回答

0

我会想象它在那里清楚地表明在那个位置会有一个填充字节。如果有人想在将来添加一个字节字段,这可能会很有用。

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

0

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

如果我们想要对齐8,16,32等...字节,我们需要明确告诉编译器。