我有一个代码,有几个未初始化的全局变量,为了简单起见,让我们说3:
int global_uninitialized_0;
int global_uninitialized_1;
int global_uninitialized_2;
在编译这段代码时,size报告的大小是16。
如果我添加了更多的全局未初始化变量,则函数将按预期增长。然而,如果我使用一个int数组,它的增长比我预期的要多:
int global_uninitialized_0;
int global_uninitialized_1;
int global_uninitialized_2[4];
在编译这段代码时,size报告的大小是48。请注意,当使用一个3个元素的数组时,数组也会按预期增长。
为什么会出现这种差异?我想说有某种联系,但我找不到任何相关的东西。
1条答案
按热度按时间uinbv5nw1#
在编译
x86_64
的测试时,我观察到以下布局:.bss
的大小(这里是32个字节)非常合理,因为global_uninitialized_2
从16个字节开始进入.bss
部分,所以问题是:为什么编译器决定在global_uninitialized_1
和global_uninitialized_2
之间留下一个8字节的漏洞?我猜测GCC试图在16字节的边界上对齐这个数组,以实现缓存对齐的目的。
如果您将
global_uninitialized_2
的定义更改为仅需要4字节对齐:然后你会得到一个24字节的
.bss
,数组会在单个int
之后立即分配。