C结构的大小

时间:2012-06-20 09:46:07

标签: objective-c struct sizeof

  

可能重复:
  Why isn't sizeof for a struct equal to the sum of sizeof of each member?

我有一个像这样定义的简单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。)

2 个答案:

答案 0 :(得分:3)

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

但是,有时这是必要的,并且用于控制对齐和填充的clang / llvm方法是__attribute__((packed))

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

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

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

答案 1 :(得分:0)

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

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