3

可能重复:
为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

我有一个简单的 C 结构定义如下:

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} LMWinData;

稍后在代码中,我定义了一个这种类型的变量,如下所示:

LMWinData   lmWinData;

现在,如果我打印出这个变量的大小:

NSLog(@"data has size of %lu bytes", sizeof(lmWinData));

我没有得到预期的值(5 个字节)。我得到了 6 个字节的大小。

那么,这里有什么问题?

非常感谢!

(我使用的是 Mac OS X Lion。)

4

2 回答 2

3

您在这里看到对齐问题。在处理试图有效地使软件访问位置的编译器时,这可能是一个棘手的问题。特别是,您有一个结构,其中两个 16 位整数跟随一个 8 位,导致 16 位整数从奇数位置开始,这通常很慢。

但是,在某些情况下这是必要的,用于控制对齐和填充的 clang/llvm 方法是__attribute__((packed)).

或者,在您的结构上使用:

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} __attribute__((packed)) LMWinData;

我认为这也适用于现代 gcc。

于 2012-06-20T09:55:26.373 回答
0

看结构填充,对齐。有一些方法可以在某些编译器中强制对齐:

typedef struct LMWinData {
    UInt8   itemTypeID;
    UInt16  serviceID;
    UInt16  methodID;
} LMWinData __attribute__ ((aligned (1)));
于 2012-06-20T09:50:34.003 回答