首页
学习
活动
专区
工具
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 运行可执行文件,我们会看到下面的结果。 为了更好理解,这里画了一个流程图供大家参考。

53320

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

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

10210

体验79毫秒启动一个项目

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

91220

【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.5K20

linux为什么没有病毒

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

4.8K10

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

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

58370

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

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

76610

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

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

2.8K30

Java 革新之路:GraalVM 原生镜像

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

1.2K40

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

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

38230

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

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

67950

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

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

3.4K41

动态链接相关结构

在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.6K20

编译运行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命令时,发生了以下错误信息: ...

10.9K52

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

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

46610

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.2K50

使用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监控屏配置参数介绍

6.1K30

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

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

51631

动态库详解

查看一个符号为什么活着 -Xlinker -why_live -Xlinker _global_function 调用脚本查看打印信息 build 动态库.dylib.framework编译链接详解...> r -> q 修改可执行文件rpath路径 -> install_name_tool -rpath 当然也可以重新添加一个@rpath -> 注意:可执行文件...'@loader_path': 表示被加载'Mach-O'所在目录, 每次加载时, 都可能被设置为不同路径, 由上层决定 * @loader_path -> 一句话就是谁链接动态库那个可执行文件路径...loader_path说明,动动链接 可执行文件 -> 链接了一个动态库, 但是同时这个动态库里面 -> 链接有其他动态库 注意: 此时编译应该从后往前编译 -> 即先编译最里面的动态库 (01...可执行文件为什么能够使用动态库 -> 因为动态库暴露了自己导出符号给可执行文件 但是最里层动态库对于最外层可执行文件,其导出符号是否暴露呢 查看最里层导出符号表 -> objdump --

82820

详解共享库动态加载

在本文中,将尝试解释在Linux系统中动态加载共享库内部工作原理。 这边文章不是一个如何引导,尽管它确实展示了如何编译和调试共享库和可执行文件。为了解动态加载内部工作方式进行了优化。...写这篇文章是为了消除在该主题上知识欠缺,以便成为一名更好程序员。希望它也能帮助您变得更好。 什么是共享库 库是一个包含编译后代码和数据文件。...可以静态地执行此操作-并将random库中所有符号直接加载到main可执行文件中。 我们告诉编译器我们要使用librandom文件。由于它是动态加载为什么我们在编译时需要它?...好, 我们已经知道main依赖于librandom.so, 那么,为什么在运行时main找不到librandom.so ? 运行时搜索路径 ldd是一个工具,使我们可以查看递归共享库依赖关系。...基本上,它允许您使提升特权可执行文件加载您自己库,该库将以root用户(或其他用户)身份运行。以root身份运行自己代码几乎可以使您完全控制所使用计算机。

3K20
领券