gcc编译器中结构的大小

时间:2012-04-23 09:55:35

标签: c

  

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

为什么结构的大小不等于其成员的大小?我能做些什么来减少它们? 假设我有一个结构`

struct a{

int a;
int b[10];
char a;

}

尺寸是多少?

4 个答案:

答案 0 :(得分:1)

允许编译器在struct成员之间添加填充以使处理更有效,这就是为什么大小可能不同

例如:

struct Message
{
  short opcode;
  char subfield;
  long message_length;
  char version;
  short destination_processor;
};

编译器使用的实际结构定义

struct Message
{
  short opcode;
  char subfield;
  char pad1;            // Pad to start the long word at a 4 byte boundary
  long message_length;
  char version;
  char pad2;            // Pad to start a short at a 2 byte boundary
  short destination_processor;
  char pad3[4];         // Pad to align the complete structure to a 16 byte boundary
};

在上面的示例中,编译器添加了填充字节以强制执行目标处理器的字节对齐规则。如果在不同的编译器/微处理器组合中使用上述消息结构,则该编译器插入的填充可能不同。因此,使用相同结构定义头文件的两个应用程序可能彼此不兼容。 因此,在编译器和/或微处理器不同的机器之间的接口中共享的所有C结构中显式插入填充字节是一种很好的做法。

How structure padding done

答案 1 :(得分:0)

由于对齐,结构成员之间和之后可能出现填充。

您可以使用packed属性

打包带有gcc的结构成员
struct a {
    int a;
    int b[10];
    char a;
} __attribute__((packed));

存储量会减少,但代码的效率可能也会降低。

答案 2 :(得分:0)

在gcc编译器中,内存分为四个字节块。因此,结构的大小将为48.虽然char只占用一个字节,但将提供四个字节,最后三个字节将被填充。您可以使用pragma指令删除此填充。只需使用

#pragma pack 1

答案 3 :(得分:0)

C和C ++编译器使用填充来对齐(通常)四字节边界上的struct成员,因为这样可以在32位处理器上更有效地访问它们。

在GCC中,你可以使用packed属性覆盖它并请求结构打包(删除此填充):

struct a
{
    int a;
    int b[10];
    char c;
} __attribute__((packed));