栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

牛客模拟面 面经1/2

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

牛客模拟面 面经1/2

牛客模拟面 面经1/2
      • Linux 中 fork() 函数的作用
      • 静态变量/全局变量/局部变量的特点
      • STL 中 resize() 和 reserve() 的区别
      • 虚拟地址空间有哪些部分
      • map 和 unordered_map 的区别?
      • 简述一下堆和栈的区别

Linux 中 fork() 函数的作用

它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。

静态变量/全局变量/局部变量的特点
  1. 位置

    局部变量:在函数中或者方法中,函数的参数,局部代码块中。

    全局变量:在文件中,函数外。

    静态变量:使用 static 修饰,可以是局部、全局或者修饰类成员。

  2. 作用域

    局部变量:作用域为局部,也就是函数或方法中,出了作用域就不能访问,同一作用域不能有同名的变量,如果全局变量和局部变量同名,则访问时采用"就近原则"。

    全局变量:作用域为全局,在本文件或者其它文件中都可以访问,在其它文件中访问可以通过 extern 进行声明,表示使用外部的全部变量。

    静态变量:静态局部变量作用域为局部,静态全局变量作用域为所在文件中,其它文件中访问不了。

  3. 内存位置

    局部变量:存储在栈内存中。

    全局变量:存储在静态存储区中,如果未初始化或者初始化为0,在BSS段,初始化了在DATA段。

    静态变量:存储在静态存储区中,如果未初始化或者初始化为0,在BSS段,初始化了在DATA段。

  4. 生命周期

    局部变量:出了作用域销毁。

    全局变量:程序结束销毁。

    静态变量:程序结束销毁。

STL 中 resize() 和 reserve() 的区别

resize() 和 reserve() 两个成员函数都是 vector 容器的公有成员函数,涉及到容器的 capacity 和 size。

  1. capacity 和 size

capacity:该值在容器初始化时赋值,指的是容器能够容纳的最大的元素的个数,也就是容量。

size:指的是容器中实际元素的个数。

resize() 既修改了 capacity 大小,也修改了 size 大小,而 reserve() 只修改 capacity 大小,不修改 size 大小。

  1. resize() 和 reserve() 的功能及区别

resize():重新指定容器的长度,若容器变长,则以默认值填充新位置(还有一个重载的 resize() 函数,可以使用指定的元素进行填充),如果容器变短,则末尾超出容器长度的元素被删除。

reserve():容器预留len个元素长度,预留位置不初始化,元素不可访问。

虚拟地址空间有哪些部分

用户空间、内核空间、栈空间、堆空间、代码段、BSS段、DATA段

  1. 内核空间

    存放内核的代码和数据,所有进程的内核代码段都映射到同样的物理内存,并在内存中持续存在,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。

  2. 用户空间

    用户空间给各个进程使用,也称为使用者空间。用户空间中的代码运行在较低的特权级别上,只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。用户空间又大致细分为下列一些空间:

    • 栈空间
    • 共享区
    • 堆空间
    • BSS 段(未初始化数据段)
    • DATA 段(已初始化数据段)
    • TEXT 段(代码段)
    • 保留区
map 和 unordered_map 的区别?

map 和 unordered_map 都是 C++ STL 中的容器,它们的区别主要体现在头文件、实现原理、优缺点以及适用场景的不同。

  1. 头文件

#include < map >

#include < unordered_map >

  1. 实现原理

    • map 底层采用红黑树实现,红黑树具有自动排序的功能,因此 map 内部的所有元素都是有序的,红黑树的每一个节点都代表着 map 的一个元素。对于 map 进行的查找、删除、添加等一系列的操作都相当于是对红黑树进行的操作。
    • unordered_map 内部实现了一个哈希表,其元素的排列顺序是无序的。
  2. 优缺点及适用场景

    • map

      • 优点:有序性,其元素的有序性在很多应用中都会简化很多的操作;底层适用红黑树实现,因此效率非常的高
      • 缺点:空间占用率高,因为map 内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
      • 适用场景:对于那些有顺序要求的问题,用map 会更高效一些
    • unordered_map

      • 优点:内部实现了哈希表,因此其查找速度非常的快
      • 缺点:哈希表的建立比较耗费时间适用处:对于查找问题,unordered_map 会更加高效一些
简述一下堆和栈的区别
  1. 管理方式

对于栈来讲,是由编译器自动管理,无需手动控制;对于堆来说,分配和释放都是由程序员控制的。

  1. 空间大小

总体来说,栈的空间是要小于堆的。堆内存几乎是没有什么限制的;但是对于栈来讲,一般是有一定的空间大小的。

  1. 碎片问题

对于堆来讲,由于分配和释放是由程序员控制的(利用new/delete 或 malloc/free),频繁的操作势必会造成内存空间的不连续,从而造成大量的内存碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的数据结构,在某一数据弹出之前,它之前的所有数据都已经弹出。

  1. 生长方向

对于堆来讲,生长方向是向上的,也就是沿着内存地址增加的方向,对于栈来讲,它的生长方式是向下的,也就是沿着内存地址减小的方向增长。

  1. 分配方式

堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配,静态分配是编译器完成的,比如局部变量的分配;动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器实现的,无需我们手工实现。

  1. 缓存方式

栈使用的是一级缓存, 通常都是被调用时处于存储空间中,调用完毕立即释放;堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收),所以调用这些对象的速度和效率都要相对低一些。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024771.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号