1

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

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

struct a{

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

}

尺寸是多少?

4

4 回答 4

1

允许编译器在结构成员之间添加填充以提高处理效率,这就是大小可能不同的原因

前任:

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 结构中显式插入填充字节是一种很好的做法。

结构填充是如何完成的

于 2012-04-23T09:58:02.480 回答
0

因为对齐可能会出现在结构成员之间和之后的填充。

packed您可以使用以下属性将结构成员与 gcc 打包:

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

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

于 2012-04-23T09:58:23.350 回答
0

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

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

struct a
{
    int a;
    int b[10];
    char c;
} __attribute__((packed));
于 2012-04-23T10:01:45.013 回答
0

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

#pragma pack 1
于 2012-04-23T09:58:49.217 回答