包含两个指针的struct的大小
这个结构的大小是多少? (32位系统计算。不是64位。)
struct list_element { short data; struct list_element* next; struct list_element* prev; };
我试过用这些公式计算大小:
(sizeof(list_element *)+ sizeof(短))+((sizeof(list_element *)* 2)
- (4 + 2)+(4 * 2)= 6 + 8 = 14
(sizeof(短))+(sizeof(list_element *)* 2)
- 2 +(4 * 2)= 2 + 8 = 10
(sizeof(list_element *)+ sizeof(list_element *)+ sizeof(short))+(sizeof(list_element *)* 2)
- (4 + 4 + 2)+(4 * 2)= 10 + 8 = 18
(sizeof(list_element *)+ sizeof(list_element *)+ sizeof(short))
- (4 + 4 + 2)= 10
但是,他们没有返回正确的答案。 你用什么公式来计算这个结构的大小?
更新:
我的老师说我们忽略了数据对齐…希望这不会让任何人失去太多,因为你使用处理数据与你的代码和结构对齐…
更新2感谢您的帮助和数据对齐介绍。
答案是10没有数据对齐…不知道为什么我急于在C中使用数据对齐……这很有趣吗?
另外,数据对齐的答案是12.正如你们所解释的那样,你必须将数据对齐短路以匹配整数。 因此,你有(2 +(2个额外字节))+ 4 + 4 = 12。
结构的大小由下式给出:
size_t size = sizeof(struct list_element);
事实上,你有两个成员指向结构只是意味着你要添加两次指针的大小。 在32位构建中,sizeof将解析为每个指针另外4个字节,在64位构建上,它将导致每个指针额外增加8个字节。
另一件需要注意的事情是,结构的大小可能不仅仅是各个成员的sizeof的总和,因为结构中的存储通常用于对齐目的。 因此,在您的短名称和下一名成员之间,填充将导致额外的大小。
我使用“ 可能”这个词的原因是,如果在源中使用了pragma pack指令,则可以更改打包对齐,从而导致sizeof的值不同。
关于结构对齐填充的两个很好的讨论 : 这里的一般性讨论 ,以及如何减少内存占用 。 第二个链接特别有趣,因为它处理结构对齐,填充和位字段,以及每个链接如何影响内存使用。
虽然您的老师要求忽略数据对齐,但该结构的大小为10个字节,假设short
为2个字节..但实际上short
大小不是固定的,而是至少 2个字节!
看看这里 。 你有没有正确报告老师的问题?
这将返回结构的大小:
sizeof(struct list_element);