gpt4 book ai didi

c - GCC 为 Mersenne 程序输出非常大的可执行文件

转载 作者:太空狗 更新时间:2023-10-29 17:18:29 24 4
gpt4 key购买 nike

来自 http://bellard.org/mersenne.html 的程序GCC 生成约 130MB 的可执行文件。为什么?

最佳答案

尝试更改 t[1<<25]={2}t[1<<25] *可执行文件**的大小将下降到 7.3 K。 (不用说,你不会得到正确的结果)

如果它只是 t[1<<25] ,它根本不会占用任何空间。

这里的问题是数组正在初始化(第一个元素=2,接下来的 2^25-1 个元素全为 0),并且全局数组被放置在数据段中,因为它被初始化。


为 2 个版本生成程序集并检查差异使其更加清晰:

[axiom@axiom ~]$ diff without_mem.s with_mem.s 
15c15,21
< .comm t,134217728,32
---
> .globl t
> .align 32
> .type t, @object
> .size t, 134217728
> t: ***<- HERE!***
> .long 2
> .zero 134217724

我们可以注意到,在原始版本中,汇编程序被指示在数据段中生成 2^27 (134217728) 字节。所以它成为目标文件本身的一部分。 (您可以通过使用 -S 开关 gcc -S -fverbose-asm t1.c 进行编译来生成程序集)


但为什么是 129 MB?
   1<< n= 2^n (1 left shifted n times).  =>  1<<25=2^25.      now 1 Integer= 4 bytes =2^2 bytes  => 2^25 Integers=2^27 bytes=2^7 * 1 M bytes= 128 MBs     

详情请见:


*注 1:它是一个 object file严格来说。

注意 2:正如评论中所指出的,还可能注意到进程(正在执行的程序)的总大小为 129Mb,即使可执行文件的大小为 7.3K。 (一旦程序开始执行,就会分配内存)。您可以使用 top 查看程序的内存使用情况。命令。

注3:值得强调的是,这只因为t是全局的。函数本地数据的分配仍然在运行时发生在堆栈上。所以如果t是本地的,目标文件只会占用 7.3K。

注4:已初始化static局部变量,如初始化的全局变量,也保存在 data 中部分。 static global 与全局变量相同,只是您将变量的范围限制为仅当前文件。

关于c - GCC 为 Mersenne 程序输出非常大的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13855582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com