gcc如何计算结构所需的空间?

时间:2011-08-06 00:34:29

标签: c gcc struct

struct {
   integer a;
   struct c b;
   ...
}

一般来说,gcc如何计算所需的空间?这里有没有人偷看过内部人员?

4 个答案:

答案 0 :(得分:12)

我没有“偷看内幕”,但它很清楚,任何理智的编译器都会以完全相同的方式完成它。过程如下:

  1. 从0开始。
  2. 对于每个元素,圆形大小直到该元素的下一个对齐倍数,然后添加该元素的大小。
  3. 最后,圆形尺寸最多为所有成员对齐的最小公倍数。
  4. 这是一个例子(假设int是4个字节并且有4个字节对齐):

    struct foo {
        char a;
        int b;
        char c;
    };
    
    1. 尺寸最初为0.
    2. 围绕char(1)对齐;大小仍然是0。
    3. 添加char(1)的大小;现在大小为1。
    4. 围绕int(4)的对齐;大小现在是4。
    5. 添加int(4)的大小;现在大小为8。
    6. 围绕char(1)对齐;大小仍然是8。
    7. 添加char(1)的大小;大小现在是9。
    8. 圆到1厘米(1,4)(4);大小现在是12。
    9. 修改:为了解决为什么最后一步是必要的,假设大小只是9而不是12.现在声明struct foo myfoo[2];并考虑&myfoo[1].b,即13超过myfoo开头的字节和超过&myfoo[0].b的9个字节。这意味着myfoo[0].bmyfoo[1].b都不可能与所需的对齐方式(4)对齐。

答案 1 :(得分:1)

没有真正标准化的对齐结构的方法,但经验法则是这样的:整个结构在4或8字节边界处对齐(取决于平台)。在结构中,每个成员按其大小对齐。所以以下包没有填充:

char         // 1
char
char
char
short int    // 2
short int
int          // 4

总大小为12.但是,下一个将导致填充:

char   // 1, + 1 bytes padding
short  // 2
int    // 4
char   // 1, + 1 byte padding
short  // 2
char   // 1
char   // 1, + 2 bytes padding

现在结构占用了16个字节。

这只是一个典型的例子,细节取决于您的平台。有时您可以告诉编译器永远不会添加任何填充 - 这会导致更昂贵的内存访问(可能会引入并发问题),但会节省空间。

要尽可能高效地布置聚合,请按大小排序成员,从最大的开始。

答案 2 :(得分:0)

结构的大小是实现定义的,但是如果没有更多信息(很不完整),很难说结构的大小是多少。例如,给定struct

struct MyStruct {
     int abc;
     int def;
     char temp;
};

在我的编译器上产生9的大小。 int 4 字节和char 1 字节。

答案 3 :(得分:-1)

修改了您的代码,以便在Eclipse / Microsoft C编译器平台上编译并运行它:

    struct c {
       int a;
       struct c *b;
    };

    struct c d;

    printf("\nsizeof c=%d, sizeof a=%d, sizeof b=%d",
                sizeof(d), sizeof(d.a), sizeof(d.b));

    printf("\naddrof c  =%08x", &c);
    printf("\naddrof c.a=%08x", &c.a);
    printf("\naddrof c.b=%08x", &c.b);

上面的代码片段产生了以下输出:

   sizeof c=8, sizeof a=4, sizeof b=4
   addrof c  =0012ff38
   addrof c.a=0012ff38
   addrof c.b=0012ff3c

执行类似这样的操作,以便您可以看到(没有注意)编译器如何格式化结构。