因为该区域是用零初始化的,所以在某些系统上它不需要是二进制的.加载器将简单地告诉OS内存空间的某些部分将被标记为已分配,并且OS将提供必要的归零页面.
在x86_64上的Linux上使用GCC编译您的程序(AS a
)后,您可以看到一条指示A
分配1,000,000,032(3b9aca20
)字节的"指令".NOBITS
指的是它不在二进制中.
$ readelf -S a
There are 31 section headers, starting at offset 0x3998:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
...
[26] .bss NOBITS 0000000000004020 00003010
000000003b9aca20 0000000000000000 WA 0 0 32
...
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
l (large), p (processor specific)
它不仅不会占用二进制文件中的空间,而且可能会占用非常少的RAM.
在具有虚拟内存的系统(如台式机,平板电脑和手机)上,实际上可能会分配一个比系统的实际RAM大得多的零初始化静态array.这在这样的系统上是可能的,因为操作系统只需要在它开始被修改时开始花费实际资源.即使这样,它也可能只需要为被修改的特定内存页面(例如4 KiB部分)花费资源.
您仍然会受到进程地址空间的限制,但在64位系统上这实际上是无限的.