首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的64位可执行文件几乎比我的32位可执行文件大3倍?

64位可执行文件相比于32位可执行文件大3倍的原因主要有以下几点:

  1. 内存地址空间扩大:64位系统的内存地址空间比32位系统大得多,可以支持更多的内存寻址,因此在64位可执行文件中需要使用更长的地址来表示内存位置,导致文件大小增加。
  2. 数据类型长度增加:64位系统中,指针和整数等数据类型的长度通常是32位系统的两倍,这意味着在64位可执行文件中需要更多的字节来存储这些数据类型,从而增加了文件大小。
  3. 对齐要求增加:64位系统中,数据对齐的要求更高,通常要求数据按照8字节对齐,而32位系统通常是4字节对齐。为了满足对齐要求,编译器在64位可执行文件中可能会插入额外的填充字节,增加了文件大小。
  4. 扩展指令集支持:64位系统通常支持更多的指令集扩展,如SSE、AVX等,这些指令集可以提高程序的性能和功能,但同时也增加了可执行文件的大小。

总结起来,64位可执行文件相比于32位可执行文件大3倍的原因主要是由于内存地址空间扩大、数据类型长度增加、对齐要求增加和扩展指令集支持等因素导致的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

我们编写的C代码是怎样跑起来的?

要想弄明白这个问题,首先我们得了解下C语言的编程机制,关于编程机制我在前面的文章中提到过,但没有过多的描述,今天我们就一起来看看这个问题。...; return 0; } 这个文件其实是一个特殊的文本文件,就存在我们的磁盘上,被称为源代码文件 源代码文件是不能直接运行的,而我们平时运行的文件是可执行文件。...说到这里,有人就会问目标文件里存放的是机器语言代码,为什么不能直接运行目标文件呢? 其实目标文件里存放的只是编译器翻译的源代码,还不是一个完整的程序。...几乎所有的C程序都要C标准库中的函数,例如hello.c中的printf()函数,这个函数真正的代码存储在一个被称为库的文件中。...链接器的作用就是将目标文件、启动代码和库代码合并成一个可执行文件hello.exe 运行可执行文件,我们会看到下面的结果。 为了更好的理解,这里画了一个流程图供大家参考。

57620

C++程序编译之谜(三)——简单还是复杂?编译到底有哪些步骤?

通常我们用IDE写完一个程序后,点击编译按钮的时候,内部到底发生了什么?为什么会生成一个可执行文件?这个过程到底有哪些步骤呢?是很简单还是很复杂呢?...2、编译 大学如果学的是计算机专业的童鞋一定会学过一门《编译原理》的课,这门课几乎会把很多大学生折腾得死去活来。...我们在当前目录下ls,就可以看见多了一个test.s的文件,打开它看到的一大堆汇编指令。这些指令,我根本看不懂,说实话,没有接触过汇编语言的人,几乎都是看不懂的。...这些都是那些非常厉害的大神的研究领域,真不是我夸大这个难度,能开发出商用编译器的人,至少在计算机领域绝对都是逆天的天选之子。...当然,你也可以用一步到位的方式进行编译: gcc test.c -o test 这样可以直接生成可执行文件。

14410
  • 体验79毫秒启动一个项目

    Spring Native 是 Spring 推出微服务体系 Spring Cloud 之后的又一大举动,从名字可以猜出,Spring Native是一门面向云原生的技术。...上面提到了原生镜像,简单来说原生镜像是一种将Java代码提前编译为独立可执行文件(称为本机映像)的技术。可执行文件包括应用程序类,以及其依赖项的类,运行时库类以及JDK中的静态链接本机代码。...在实践中,可执行文件可能会以高度优化的容器映像(FROM scratch支持Docker镜像)的形式提供,并且减少了表面攻击,非常适合Kubernetes。...启动时间几乎是即时的,并且可以立即获得峰值性能,从而支持从零缩放(无服务器)应用程序,包括常规的Spring Boot Web应用程序。 减少了内存消耗,这非常适合拆分为多个微服务的系统。...这些原生的 Spring 应用可以作为一个独立的可执行文件(原生镜像)进行部署(不需要安装 JVM),性能非常强: 几乎瞬时的启动(一般会小于 100 毫秒) 瞬时的峰值性能以及更低的资源消耗 当然牛逼的背后肯定要稍微付出一点代价

    95720

    linux为什么没有病毒

    ;3、Linux的应用软件和系统软件几乎都是开源的,而病毒很难藏身于开源的代码中间。...那么为什么Linux系统下病毒这么少?...很多人认为 Linux 病毒少是因为Linux不像Windows那么普及,其实这种观点很早已经被人批驳过了,一个最有力的论据是:如果写病毒的人写 Windows 病毒是因为 Windows 用户多而因此破坏性大...Linux账号限制 对一个二进制的 Linux 病毒,要感染可执行文件,这些可执行文件对启动这个病毒的用户一定要是可写的。而实际情况通常并不是这样的。...开源的Linux Linux的应用软件和系统软件几乎都是开源的。这对病毒有两方面的影响。首先,病毒很难藏身于开源的代码中间。其次,对仅有二进制的病毒,一次新的编译安装就截断了病毒一个主要的传播途径。

    5K10

    【Rust日报】 2020-01-12 Rust编译出的可执行文件体积优化方法

    为什么Rust编译出的可执行文件那么大? #rust #exe 为什么相同应用用Rust编译出的可执行文件比C编译出的要大?...下面这篇文章详细阐述了原因,并提出了多重可行的方案,帮你减小可执行文件的体积,这几种方法是: 使用--release模式进行编译 在发布之前,开启LTO压缩二进制文件体积 如果你的应用不是内存密集型,使用系统分配器...(需要nightly) 你可以开启编译优化等级s/z 还有一点建议对小的可执行文件效果不明显,但是你可以尝试UPX和其他可执行文件压缩,如果你的应用很大的话 Read More 不在微信也能运行小程序?...#rust #mini 小程序从诞生到现在,我们经常收到这样的询问:小程序能脱离微信在其他终端上运行么?...运行小程序硬件框架的设备要求 ■ 最低配置 四核1.5GHz CPU 内存1GB RAM+4GB ROM 安卓5.0及以上 ■ 建议配置 四核2GHz CPU 内存2GB RAM+8GB ROM 安卓7.1

    1.6K20

    深入理解Java虚拟机到底是什么

    因为class文件并不是可以直接被操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。...虚拟机是一个大而复杂的东西,实现虚拟机的人都是大牛级别的,如果不是参与过虚拟机的实现,应该很少有人能把它参透。...如果把JVM比作一个人,那么class文件就是我们吃的食物。 3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。...4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。 5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。...等其他技术的文章, 请关注我的博客: http://blog.csdn.net/zhangjg_blog

    62370

    深入理解Java虚拟机到底是什么

    因为class文件并不是可以直接被操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。...虚拟机是一个大而复杂的东西,实现虚拟机的人都是大牛级别的,如果不是参与过虚拟机的实现,应该很少有人能把它参透。...后面的一些文章也参考了这三本书, 虽然讲解Java语法的书不计其数, 但是深入讲解虚拟机的书, 目前为止我就见过这三本,并且网上的资料也不是很多。...如果把JVM比作一个人,那么class文件就是我们吃的食物。 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。...虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。

    40730

    恶意软件是如何伪装的,这份报告给出了答案

    例如将恶意软件可执行文件伪装成合法应用程序,使用有效证书对其进行签名,或破坏可信赖的站点以将其用作分发点等。...据免费的可疑文件分析服务安全平台 VirusTotal的数据,恶意软件的伪装技巧比我们想象的要大的多。...【图:恶意软件作者使用的签名权限】  伪装成流行软件  将恶意软件可执行文件伪装成合法、流行的应用程序在 2022 年呈上升趋势。...【图:使用的应用程序图标是恶意软件的诱饵】 我们在最近的 SEO 中毒活动中看到的流行的 Windows 优化程序 CCleaner 是黑客的主要选择之一,并且其分发量的感染率异常高。...通过这种方法,恶意软件可以避开一些不审查 PR 资源结构和可执行文件内容的防病毒引擎。

    87710

    深入理解Java虚拟机到底是什么什么是Java虚拟机从进程的角度解释JVM

    可以这样理解,当它在运行的时候,它就是一个操作系统中的进程实例,当它没有在运行时(作为可执行文件存放于文件系统中),可以把它叫做程序。...因为class文件并不是可以直接被操作系统识别的二进制可执行文件 。 我们敲入的是java这个命令。...虚拟机是一个大而复杂的东西,实现虚拟机的人都是大牛级别的,如果不是参与过虚拟机的实现,应该很少有人能把它参透。...如果把JVM比作一个人,那么class文件就是我们吃的食物。 3 加载class文件的是一个叫做类加载器的子系统。就好比我们的嘴巴,把食物吃到肚子里。...4 虚拟机中的执行引擎用来执行class文件中的字节码指令。就好比我们的肠胃,对吃进去的食物进行消化。 5 虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。

    73250

    介绍 Linux 文件系统:这些目录都是什么鬼?

    比如说,刚才我们在dev中看到了一大堆设备,你想打开某些设备看看里面的内容,就可以通过命令把设备挂载到mnt目录进行操作。...不过一般来说,现在的操作系统已经很聪明了,像挂载设备的操作几乎都不用你手动做,系统应该帮你自动挂载到media目录了。...你会发现/proc里面有一大堆数字命名的文件夹,这个数字其实是 Process ID(PID),文件夹里又有很多文件。...比如说/usr/bin中含有我通过包管理工具安装的应用程序 Chrome 浏览器和 goldendict 字典的可执行文件: ?...这就是为什么,有时候普通用户可以使用的命令,用 sudo 或者超级用户却被告知找不到该命令。因为有的命令是特定用户家目录里的,仅被添加到了该用户的PATH环境变量里,只有他可以直接用。

    3.6K41

    认识目标文件的格式——a.out COFF PE ELF

    1.目标文件的常用格式 目标文件是源代码编译后未进行链接的中间文件(Windows的.obj和Linux的.o),与可执行文件(Windows的.exe和Linux的ELF)的结构和内容相似,因此跟可执行文件采用同一种格式存储...)(Windows的.lib和Linux的.a)都按照可执行文件格式存储。...,二是与可执行文件结合,作为进程映像的一部分来运行 Linux的.a,Windows的.dll 可执行文件(Executable File) 包含了可直接执行的程序 Linux下无后缀的ELF可执行文件...2.目标文件与可执行文件格式的小历史 目标文件与可执行文件的格式和操作系统和编译器密切相关,不同的系统平台下会有不同的格式,但是这些格式又大同小异,可以说,目标文件与可执行文件格式的历史几乎是操作系统的发展史...这也是为什么目前PE和ELF如此相似的原因,因为它们都是源于同一种可执行文件格式COFF。 在COFF之前,Unix最早的可执行文件格式是a.out格式,中文意为汇编器输出。

    3.1K30

    进程的概念与基础操作详解

    exe(Executable) 定义 exe是一个符号链接,指向启动该进程的可执行文件的路径。这个可执行文件是进程运行的主体,包含了程序的机器代码和资源。...fork() 是用于创建进程的系统调用。 它会从当前运行的进程(称为父进程)中复制出一个几乎完全相同的新进程(称为子进程)。 父子进程几乎完全独立,但共享相同的代码段。...为什么 **fork()** 有两个返回值? 操作系统在执行 fork() 时,会基于当前父进程的状态,创建一个几乎完全相同的子进程。...这就是为什么返回两个返回值的原因,下文会对该过程进行详细讲解。 **父进程调用 ****fork()**,操作系统知道它是父进程,所以返回子进程的 PID,方便父进程管理。...,创建一个几乎完全相同的子进程。

    14810

    Java 革新之路:GraalVM 原生镜像

    尽管 JVM 解释器的性能很好,但还是不如运行已编译的代码快。这就是为什么 Oracle 的 JVM(HotSpot)也包含了即时(JIT)编译器,它可以在程序执行时将应用程序代码编译成机器码。...我喜欢用即时性能这个词来形容它——应用程序可以在启动的第一毫秒内执行有意义的任务,不需要任何分析或编译开销。...红线表示 CPU 活动:JVM 在热身 JIT 活动期间使用了大量 CPU,而原生可执行程序几乎不使用 CPU,因为所有昂贵的编译操作都发生在构建时。...这就是为什么它比应用程序代码、库和 JVM 的总和要小得多。在某些场景中,例如在资源受限的环境中,应用程序的体积可能是一个很重要因素。UPX等工具可以进一步压缩原生可执行文件的体积。...如果你想在原生镜像中看到新的功能或改进,请通过 GraalVM 的社区平台与我们分享你的反馈! ---- 感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

    1.5K40

    动态链接的相关结构

    在LINUX下,可执行文件所需要的动态链接器的路径几乎都是 “/lib/ld-linux.so.2”,其他的*.nix操作系统可能会有不同路径。我们在后面还会介绍到各种环境下的动态链接器的路径。...在LINUX系统中,/lib/ld-linux.so.2通常是一个软链接,比如在我的机器中,它指向/lib/ld-linux.so.2,这个才是真正的动态链接器,在linux中,操作系统在对可执行文件所需要的相应动态连接器...动态链接符号表的结构与静态链接的符号表几乎一样,我们可以简单的将导入韩式看作是对其他目标文件中函数的引用:把导出函数看作是在本目标文件定义的函数就可以了; 3....为什么这个字符串常量的地址在PIC时不需要重定位而在非PIC时需要重定位呢?...先是一个32位类型的值,后面是一个32位的数值部分,你很可能很奇怪为什么要用一个union把后面的32位数值包装起来,事实上,这个union没啥用,只是历史遗留而已,可以当做不存在。

    1.7K20

    编译运行Linux内核源码中的BPF示例代码

    社区的大佬们为学习BPF的同学们准备了福利 ,Linux内核源码里包含了大量的BPF示例代码,几乎覆盖了所有种类的BPF程序,非常适合学习者阅读和测试。今天为大家介绍如何编译运行这些BPF示例代码。...目录 TL;DR 内核源码里的BPF示例代码 下载Linux内核源代码 编译BPF示例代码 分析samples/bpf/Makefile文件 我在执行Make命令遇到的问题 为自己的BPF程序生成可执行文件...bpf/ # or make M=samples/bpf 如下截图看结果,生成了一大堆的文件,有.o后缀的目标文件,还有绿色高亮的可执行文件,挑两个执行下,效果符合期待。...看过本站关于BPF博文的同学可能已经看出如上代码的玄机了,我把它简化下: 从上面的简化版命令,可以看出最后一行make命令的本质,就是把所有.c源代码文件,通过clang全部编译成.o目标文件。...我在执行Make命令遇到的问题 我自己的实验环境是Ubuntu 18.04 with 4.15.0内核,在执行上面的make命令时,发生了以下的错误信息: ...

    11.5K52

    【Linux系统编程】Linux下的编译器——gccg++的使用 及 动态库和静态库的认识

    我先来创建一个源文件myfile.c 对于这样一个源文件,如果我们直接gcc编译的话,他会直接做完整个翻译过程,自动生成一个名为a.out的可执行文件 我们就可以直接执行输出结果。...那上面我们演示的是从源文件直接生成可执行文件,那如果我想让它执行完预处理过程就停下来呢?...所以我们也可以-o指定一下文件名,把它放到对应文件里 那对于预处理之后的文件,一般后缀为.i 首先我们可以观察到预处理之后文件大小大了很多。...大家思考一个问题,为什么我们在Linux上可以进行C/C++代码的编译链接这些动作呢?...然后就可以进行静态链接了 对应的命令是 gcc -static:静态链接 ,大家看到了吗,静态链接生成的可执行文件比动态链接生成的大了好多好多。

    1.7K10

    用过那么多评估开发工作量的指标,还是它最好用!

    为什么最终LOC(代码行数)度量指标成功了呢?” 作为软件工程师,你需要了解团队或个人在项目中的生产力情况。...不过,由于可执行文件包含未初始化的数据,因此虽然它们增加了文件大小,但是与系统的复杂性几乎没有或者根本没有关系。除此之外,库函数会增加可执行文件的大小,但是它们实际上降低了项目的复杂性。...机器指令度量指标:它的主要缺陷是某些可执行文件格式包含了未初始化的静态变量空间,这意味着对源文件的微小更改可能会极大地改变可执行文件的大小。...02 为什么LOC(代码行数)度量指标如此受欢迎 你发现,不管使用什么样的度量指标,它都有缺点。...在试读本书后,我把本书推荐给计算机专业的毕业生以及职场里在一线编码的各位程序员。

    66031

    Linux环境下通过GDB调试C项目实战

    这个Makefile中的几条命令大致为: make clean:清除已经存在的result可执行文件 make/make result:将已经得到的可执行文件main.o与array.o链接成可执行文件...:清除已经存在的main.o可执行文件 array:清除已经存在的array.o可执行文件并编译array.c生成array.o文件 main:清除已经存在的main.o可执行文件并编译mian.c生成...main.o文件 main_optimize:编译mian.c生成main.o文件,开启O2优化(该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法...,用以提高目标代码的运行速度.) array_optimize:编译mian.c生成main.o文件,开启O2优化(该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法...查看完毕,果真和之前初步调试的一样,在array_add和array_fill两个函数里面都涉及到段错误,数组越界,length被取等号,但为什么没有发生报错或者错误终止程序是因为在最后的print函数里面只涉及到了正常的

    5.3K50

    深入浅出GCC编译器

    地址 -e 可执行文件名 -f,可以看到文件位置,行号都打印出来了 我么可以确认一下是不是第11行,cat -n 显示行号 ⑦ strings: 显示程序文件中的可显示字符串。...可以通过管道和grep过滤自己需要的信息 3. glibc库 glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。...程序的一般编译流程主要包括四大部分:预处理、编译、汇编和链接。下面讲解这四步的具体工作,带你了解源文件到可执行文件的“进化之路”。...我这里生成了4个可执行文件,有==.out== 后缀的,有没有后缀的,甚至还有一个 .pp 后缀的,但他们都是可执行的 (2)参数及工具 ① 预处理阶段 预处理也叫做预编译,这个阶段GCC会调用 cpp...那么,我们为什么要重定向到一个.i文件中,而不是重定向到.c文件中呢?前面说了,GCC通过文件后缀来区分文件类型,只有.i文件才能作为编译的输入,这么做是为了下一步。

    53810

    使用GraalVM 构建 Spring Boot 3.0 原生可执行文件

    GraalVM Native Image 介绍 GraalVM Native Image 是GraalVM 提供的一种能够将Spring Boot 程序打包成云原生可执行文件的技术,并且比JVM 占用更少的内存和更快的启动速度...一共7个步骤,花费了差不多2分钟打包完,生成的可执行文件在target目录 5、运行可执行文件 双击exe文件,Spring Boot 应用程序几乎瞬间启动完毕,文件大小有68M,对于一个没什么业务代码的...,但同时包也大了很多 ,有点空间换时间的意思。...如果要打包原生可执行文件的话,环境配置也比较繁琐。不过使用GraalVM 来替代JVM 跑Java 程序还是很值得尝试的。...配置步骤) 作者其他文章: Grafana 系列文章,版本:OOS v9.3.1(更新中) Grafana 的介绍和安装 Grafana监控大屏配置参数介绍(一) Grafana监控大屏配置参数介绍

    8.1K30
    领券