面试的一些问题

拜托,线程间的通信真的很简单。 - 知乎
分段和分页机制_续航fff的博客-CSDN博客_分页和分段
C++里 const int* 与 int const* 有什么区别? - 知乎单例模式和工厂模式_满心欢喜~的博客-CSDN博客_单例模式和工厂模式
C++里 const int* 与 int const* 有什么区别? - 知乎


Java并发编程:volatile关键字解析 - Matrix海子 - 博客园
【JVM虚拟机】(2)---GC 算法与种类 - 雨点的名字 - 博客园Java并发编程:volatile关键字解析 - Matrix海子 - 博客园
【JVM虚拟机】(2)---GC 算法与种类 - 雨点的名字 - 博客园

经典面试题之new和malloc的区别_nie19940803的博客-CSDN博客_new和malloc的区别

有了malloc,为什么还要有new?设计者设计new的原因是为什么?

​​​​​​​malloc是面向内存的,你要开多大,就给你开多大,开了就不管了。new是面向对象的,根据你指定的数据类型来申请对应的空间,并且能够直接内部调用构造函数生成对象。

对于非内部数据类型而言,malloc/free无法满足动态对象的要求。对象在创建时需要自动执行构造函数,在消亡之前需要自动执行析构函数。由于malloc/free是库函数而不是操作符,不在编译器控制权限之内,不能把执行的构造函数和析构函数强加于malloc/free,所以有了new/delete​​​​​​​粘包和分包_唐孝辉的博客-CSDN博客_分包粘包游戏用tcp还是udp_不摆烂的zzz的博客-CSDN博客_游戏用udp还是tcpIT挑战高薪开发常识-为什么把堆和栈区分开来?C/C++链接过程、动态链接库.so和静态链接库.a_苦逼的程序猿☺-CSDN博客

链接过程主要包括地址和空间分配,符号决议和重定位等步骤。

符号表存放在目标文件(包含数据段,代码段和符号表)中。
本质上整个符号表只是想表达两件事:

  • 我能提供给其它文件使用的符号
  • 我需要其它文件提供给我使用的符号

静态链接库

简单来说,静态库就是多个目标文件的打包集合,我们引用一个静态库,只需进行编译链接过程即可,静态库的代码会直接copy到最终的可执行文件中

对于静态链接,最终生成的可执行文件:

可执行文件和目标文件一样,也是由代码段和数据段组成。
每个目标文件中的数据段都合并到了可执行文件的数据段,每个目标文件当中的代码段都合并到了可执行文件的代码段。
目标文件当中的符号表并没有合并到可执行文件当中,因为可执行文件不需要这些字段。
缺点:由于将代码都copy到可执行文件中,那就会增大文件的大小。当我们有多个可执行文件都使用了同一个静态库也会造成重复冗余。

动态链接库

动态链接库的出现就解决了上边的问题。
动态库允许使用该库的可执行文件仅仅包含对动态库的引用而无需将该库拷贝到可执行文件当中。
动态链接可以在两种情况下被链接使用,分别是load-time dynamic linking(加载时动态链接) 以及 run-time dynamic linking(运行时动态链接)

load-time dynamic linking(加载时动态链接)
这里的加载指的是程序的加载,而所谓程序的加载就是把可执行文件从磁盘搬到内存的过程,因为程序最终都是在内存中被执行的。操作系统会查找可执行文件依赖的动态库信息(主要是动态库的名字以及存放路径),找到该动态库后就将该动态库从磁盘搬到内存,并进行符号决议。从总体上看,加载时动态链接可以分为两个阶段

阶段一,将动态库信息写入可执行文件;

阶段二,加载可执行文件时依据动态库信息进行动态链接。


相比较与静态链接,加载时链接将过程推迟到了程序启动加载时。
run-time dynamic linking(运行时动态链接)
相比较与加载时,运行时将这个过程再次推迟到了程序运行时
由于在编译链接生成可执行文件的过程中没有提供所依赖的动态库信息,因此这项任务就留给了程序员,在代码当中如果需要使用某个动态库所提供的函数,我们可以使用特定的API来运行时加载动态库,在Windows下通过LoadLibrary或者LoadLibraryEx,在Linux下通过使用dlopen、dlsym、dlclose这样一组函数在运行时链接动态库。当这些API被调用后,同样是首先去找这些动态库,将其从磁盘copy到内存,然后查找程序依赖的函数是否在动态库中定义。这些过程完成后动态库中的代码就可以被正常使用了。
对于动态链接生成的可执行文件,除了数据段和代码段,会新增两段,即dynamic段以及GOT(Global offset table)段。
dynamic段中保存了可执行文件依赖哪些动态库,动态链接符号表的位置以及重定位表的位置等信息。当加载可执行文件时,操作系统根据dynamic段中的信息即可找到使用的动态库,从而完成动态链接。
程序中的内存分配 - hao.ma - 博客园

栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈

1. 函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。

2. 栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量

3. 栈中存储的数据的生命周期随着函数的执行完成而结束

堆由程序员分配释放, 若程序员不释放,程序结束时由OS回收,分配方式倒是类似于链表

1. 堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面

原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系

程序中的内存分配 - hao.ma - 博客园自旋锁和互斥锁区别_心向暖的博客-CSDN博客_自旋锁和互斥锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值