int main[-1U] = {1};
Run Code Online (Sandbox Code Playgroud)
这很简单.用它编译
gcc foo.c
Run Code Online (Sandbox Code Playgroud)
不会生成任何文件(至少我lsof在后台挂起GCC时无法找到它gcc & :),但是会丢失16 GiB的二级存储(硬盘驱动器).
这是如何运作的?
你可以用一个简单的方法解决这个谜团printf:
printf("%zu\n", (size_t)-1U);
Run Code Online (Sandbox Code Playgroud)
这产生4294967295(演示) - 足以在sizeof(int)等于的系统上填充16Gb的内存4.
要了解为什么在文件系统中占用这么多空间,请编译foo到目标文件,然后运行size实用程序.
我修改了程序,将数组大小调整为1,000,000个元素.以下是您从运行中获得的输出size:
$ gcc -c foo.c
$ size -A -d foo.o
foo.o :
section size addr
__text 0 0
__data 4000000 0
Total 4000000
Run Code Online (Sandbox Code Playgroud)
__data段包含初始化数据.编译器填充它,因为您提供了{1}初始化程序.如果省略它,磁盘上可执行文件的大小将缩小到几千字节,因为该数组将放入未初始化的段:
$ size -A -d foo.o
foo.o :
section size addr
__text 0 0
Total 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |