Linux——对动静态库的优缺点和底层剖析对比

news2024/12/26 11:27:11

目录

静态库底层剖析:

所以静态库的优缺点总结:

动态库底层剖析:

所以使用动态库的优缺点剖析:


静态库底层剖析:

         如上图:file1.exe被加载到了内存,成为了进程,因为代码中都有printf函数的应用,且我们采用的是libC.a静态库进行链接,所以操作系统将静态库中关于printf函数的实现方法拷贝了一份,然后拿到内存的代码区中。此时file2.exe文件也被加载到了内存,且代码中也有printf函数的应用,所以同样的,操作系统将静态库中关于Printf函数的实现方法又拷贝了一份,放在内存的代码区中。

        静态库的缺点就体现出来了!因为两个文件中都有printf,就不得不拷贝两份printf的底层实现到内存,若是有100个文件也都拥有printf,意味着操作系统还要再从静态库中拷贝100次,造成了内存区域中代码的冗余。

        而优点在于将静态库的printf拷贝到内存后,就代码后面再出现printf就不再依赖静态库了,因为内存中已经有了printf的实现方式。

所以静态库的优缺点总结:

(1)静态库在使用时,直接把代码复制到目标文件中;

(2)优点: 不需要跳转,效率比较好,脱离静态库文件;

              静态库会被打包到应用程序内,加载速度上快了很多;

              发布程序时不需要依赖静态库,移植方便。

(3)缺点: 目标文件会比较大,修改和维护都不太方便;

               多个文件使用该库时,会造成代码冗余!消耗系统资源;

                更新、部署、发布麻烦;

(4)静态库文件名的名字规则: 以lib开头,以.a结尾


动态库底层剖析:

    如上图:file1.exe被加载到了内存,成为了进程,因为代码中都有printf函数的应用,且我们采用的是libC.so动态库进行链接,操作系统对静态库中关于printf函数的地址进行复制,然后拿到内存中,放在了代码内部。此时file2.exe文件也被加载到了内存,也是一样,对于printf的应用只是复制该函数的地址到代码内部。

        动态库的优点体现出来了!操作系统不需要向上面动态库那样拷贝函数的代码实现到内存中,只需要复制函数地址,等到CPU运行该函数时,从函数地址就能找到该动态库,然后在动态库中扫描Printf函数的实现方式后返回运行。

        但这样下来,程序的代码对动态库的依赖性就很强,需要来回的跳转内存的代码和动态库,效率就低了些。

所以使用动态库的优缺点剖析:

(1) 共享库的特征也叫动态库,因为它可以实现进程之间的资源共享;
(2)共享库在使用时,直接把代码中所需要用到的函数所对应的地址复制过来;

(3)优点: 目标文件比较小,修改和维护都方便;

               更新、部署、发布简单。


(4)缺点:需要跳转,效率比较低,不能脱离共享库文件;

             加载速度比静态库慢,发布程序时需要依赖动态库;

             注:当程序使用到动态库时,动态库才加载进去,此后其他程序可以共享同一个动态库。当动态库更改时,只需要更新下动态库,而应用程序不需要再进行编译、部署、发布。

(5)动态库文件名的名字规则: 以lib开头,以.so结尾

总体比较下来,动态库要优于静态库,所以在Linux中,gcc/g++编译器就是默认首选动态链接动态库。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】docker安装配置Jenkins

docker 安装 Jenkins #拉镜像 docker pull jenkins/jenkins#创建卷(volume) docker volume create jenkins_home#制作容器并启动 docker run -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ -v /usr/lib/jvm/java-8-openjdk-amd64:/usr/local/java…

IMX6ULL系统移植篇-镜像烧写方法

一. 烧录镜像简介 本文我们就来学习:windows 系统下烧录镜像的方法。 如何使用 NXP 官方提供的 MfgTool 工具通过 USB OTG 口来 烧写系统。 二. windows下烧录镜像 1. 烧录镜像前准备工作 (1)从开发板上拔下 SD卡。 (2…

SpringBoot中如何优雅的统一全局返回格式与处理系统异常?

在领域驱动设计(DDD)中,接口层主要负责处理与外部系统的交互,包括接收用户或外部系统的请求,调用应用层服务处理请求,以及将处理结果返回给请求方。 我发现一些代码中,接口的返回值类型众多&am…

chatgpt赋能python:Python语言单词大全:从入门到精通

Python语言单词大全:从入门到精通 Python是一种高级编程语言,适用于各种应用领域,如数据科学、机器学习、网站开发和自动化脚本编写等。Python语言有其内置的语法和功能,我们将在本文中逐一介绍和解释。 1. Python中最基本的单词…

K8S集群安全之安全机制

1. 安全机制说明: Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介,也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护APIServer来设计的。Kubernetes使…

小程序实现双列布局

目录 1 双列布局2 采用流式布局3 采用网格布局总结 小程序中双列布局是一个常见的效果,比如在电商小程序的商品推荐,效果如下: 1 双列布局 双列布局的话特点是随着数据的增多,我们会出现偶数或者奇数的问题,如果是偶…

【Data Studio 2.1.0连接openGauss2.1.0】

Data Studio 2.1.0连接openGauss2.1.0 一、实验环境说明二、配置客户端接入方式三、Data Studio2.1.0连接openGauss数据库 一、实验环境说明 openGauss2.1.0版本Data Studio 2.1.0 版本 二、配置客户端接入方式 【以下操作是omm用户进行】 修改配置文件pg_hba.conf&#xf…

12--Gradle进阶 - Gradle任务的类型

12--Gradle进阶 - Gradle任务的类型 任务类型 前面我们定义的task 都是DefaultTask 类型的,如果要完成某些具体的操作完全需要我们自己去编写gradle 脚本,势必有些麻烦,那有没有一些现成的任务类型可以使用呢?有的,Gradle 官网给出…

C. Tenzing and Balls - dp

分析: 补题。当时不明白的点是如何快速查询相同元素的下标,可以用last[a[i]]表示与a[i]相同的最近的一个数的下标,可以遍历数组的同时实现下标的查询和变化,不断通过遍历来更新last[a[i]]的值,即last[a[i]]i。 然后是状…

衡石bi的几种跳转方式

衡石bi的几种跳转方式 通过点击表格的单元格跳转(带参) 点击首页的表格里任意一行的单元格跳转到明细页的企业相关数据 这两个数据集都是有一个info_uuid的主键,我们知道每个控件都可以设置交互的方式进行跳转应用内的仪表盘。 点击首页里要设置跳转的控件右上角的…

maven基础教程

一、安装moven 1、下载maven包 首先到maven官网下载安装包,解压到本地目录,然后配置环境变量。 maven下载地址:https://maven.apache.org/download.cgi 2、配置环境变量 然后打开环境变量,添加 MAVEN_HOME 系统变量&#xff…

JVM-jvisualvm性能监控可视化工具使用与eden-s0-s1分配分析

目录 第一步:安装jvisualvm 第二步:安装VisualvmGc插件 方式一:jvisualvm工具直接下载安装 方式二:去官网下载导入安装 总结 第三步:idea安装VisualvM Launcher插件 第四步:演示young中eden、s0、s1垃…

轻量级数据交换格式:jsoncpp

"这不属于我&#xff0c;因为沉默背后&#xff0c;也有冲动" 一、认识json (1) 为什么有那么多的数据交换格式&#xff1f; 比如说&#xff0c;现在我有下面的数据: #include <iostream> #include <string>int main() {std::string name "张三&q…

比较两个突出的node.js框架:koa和express

目录 一、Koa 和 Express 的介绍 二、Koa 和 Express 的区别 1.异步编程方式不同 2.错误处理方式不同 三、Koa 和 Express 的优缺点 1.Express 的优点 2.Express 的缺点 3.Koa 的优点 4.Koa 的缺点 总结 接上文讲述了 koa框架&#xff0c;这边文章比较一下这两个突出…

CentOS系统忘记密码了改怎么修改重置103.88.34.X

首先&#xff0c;打开centos7&#xff0c; 在正常系统入口按↑和↓"e"&#xff0c;会进入edit模式 然后找到以“Linux16”开头的行&#xff0c;在该行的最后面输入“init/bin/sh” 按下ctrlx组合键来启动系统 接下来再输入“mount -o remount,rw /”(注意mount与…

ceph对象存储使用总结

ceph对象存储使用总结 大纲 基础概念安装对象存储网关RADOS网关配置对象存储网关RADOS网关修改RADOS网关端口修改支持https访问RADOS网关使用s3cmd操作对象存储Ceph dashboard管理RADOS网关使用java程序操作对象存储 基础准备 操作系统 ubuntu~18.04ceph版本 Octopus v15.2…

适用于 3DS Max 和 Cinema 4D 的 Chaos Corona 10重磅推出!

Chaos 发布了 Corona 10&#xff0c;适用于3DS Max和Cinema 4D 的渲染器的最新版本 &#xff01;Corona 10 对软件的多项现有功能进行了更新&#xff0c;包括贴花、体积渲染、景深和程序云。 目前渲云云渲染已支持Corona 10&#xff0c;支持批量渲染&#xff0c;批量出结果&am…

chatgpt赋能python:介绍Python语言

介绍Python语言 Python是一门易学易用的编程语言&#xff0c;它被广泛应用于各种领域&#xff0c;包括数据科学、机器学习、人工智能、Web开发等。自1991年首次推出以来&#xff0c;Python不断演进和发展&#xff0c;如今已经成为行业内一种不可或缺的编程语言。它在可读性和语…

chatgpt赋能python:Python词汇量为什么很重要?

Python词汇量为什么很重要&#xff1f; 作为一个有10年Python编程经验的工程师&#xff0c;我有着非常深刻的体会&#xff0c;词汇量对于掌握这门编程语言来说是非常重要的。在这篇文章中&#xff0c;我将重点讨论Python词汇量为什么很重要&#xff0c;以及如何提升你的Python…

STM32的五个时钟源

①HSI是高速内部时钟&#xff0c;RC振荡器&#xff0c;频率为8MHz。 ②HSE是高速外部时钟&#xff0c;可接石英/陶瓷谐振器&#xff0c;或者接外部时钟源&#xff0c;频率范围为4MHz~16MHz。 ③LSI是低速内部时钟&#xff0c;RC振荡器&#xff0c;频率为40kHz。 ④LSE是低速外…