struct {
integer a;
struct c b;
...
}
一般来说,gcc如何计算所需的空间?这里有没有人偷看过内部人员?
答案 0 :(得分:12)
我没有“偷看内幕”,但它很清楚,任何理智的编译器都会以完全相同的方式完成它。过程如下:
这是一个例子(假设int
是4个字节并且有4个字节对齐):
struct foo {
char a;
int b;
char c;
};
char
(1)对齐;大小仍然是0。char
(1)的大小;现在大小为1。int
(4)的对齐;大小现在是4。int
(4)的大小;现在大小为8。char
(1)对齐;大小仍然是8。char
(1)的大小;大小现在是9。 修改:为了解决为什么最后一步是必要的,假设大小只是9而不是12.现在声明struct foo myfoo[2];
并考虑&myfoo[1].b
,即13超过myfoo
开头的字节和超过&myfoo[0].b
的9个字节。这意味着myfoo[0].b
和myfoo[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
执行类似这样的操作,以便您可以看到(没有注意)编译器如何格式化结构。