1

我有以下结构

struct node{
    int value;
    struct node *next;
    struct node *prev;
};

而且我认为大小必须大于 sizeof(integer)。

但是如何计算这个结构的整体大小令人困惑。

那么如何计算尺寸呢?

我的意思是我想手动计算它,而不是通过计算机......

4

6 回答 6

6

大小至少是sizeof(int) + sizeof(struct node *) + sizeof(struct node *). 但它可能更多,因为编译器可以根据需要向您的结构添加填充字节。

有多大sizeof(int)sizeof(struct node*)有多大取决于您的系统。如果您有一个 32 位系统,它们可能每个是 4 个字节,或者如果您有一个 64 位系统,它们可能是 8 个字节。但真正确定的唯一方法是使用编译器打印出大小。

于 2012-10-20T08:31:20.877 回答
5

如果您谈论的是 32 位应用程序,那么整数和指针都是 4 个字节。因此,您的结构大小为 12 个字节。

struct node{
    int value;         // 0x0 - 0x4
    struct node *next; // 0x4 - 0x8
    struct node *prev; // 0x8 - 0xC
};

集会:

struct [0xDEADBEEF] {
    int 0x0;
    struct node *0x4;
    struct node *0x8;
};

旁注在 [[0xDEADBEEF]+0x0] 上读取的内存指针将返回 node->value 的当前值,依此类推。

于 2012-10-20T08:37:35.737 回答
4

sizeof (struct node)是结构的字节大小。

它相当于:

=    sizeof (int)
  +  potential unnamed padding1
  +  sizeof (struct node *)
  +  potential unnamed padding2
  +  sizeof (struct node *)
  +  potential unnamed padding3

成员之间和结构末尾的填充大小由实现定义。

于 2012-10-20T08:26:20.317 回答
3

通常,结构的大小是每个成员字段的大小相加。但是编译器可能会适当地为填充/对齐成员添加一些额外的字节。

所以在你的情况下,

sizeof(struct node) = sizeof(int) + sizeof(struct node *) + sizeof(struct node *)
                 12 = 4 + 4 + 4  (on 32-bit)
                 20 = 4 + 8 + 8  (on 64-bit)

这是一般指南,可能会因您选择的编译器/平台而异。

于 2012-10-20T08:33:49.287 回答
1

您无法手动计算确切的尺寸。你能想到的是,它至少是其成员大小的总和。

sizeof(int) + 2 * sizeof(struct node *)即在这种情况下,无论您的系统上的这些大小如何,它至少是。

由于填充对齐,它可能大于这个最小尺寸。

于 2012-10-20T08:30:59.970 回答
1

c++:正确的方法是为int plain_size()您需要的每个结构初始化方法。

struct anotherstruct {
  ...
  static int plain_size(){...};
}

struct struct1 {
  int a;
  int b;
  anotherstruct c;

  static int plain_size() {
    return sizeof(a)+sizeof(b)+anotherstruct::plain_size();
  }
}

请记住,此大小可能不等于为结构分配的内存大小

于 2012-10-20T09:46:22.787 回答