汇顶软件开发初面总结20180921

博客参考:C++中的多态和内部实现:https://www.cnblogs.com/qiaoconglovelife/p/5128523.html

                    虚函数表存放的地址:https://blog.csdn.net/jiary5201314/article/details/52627630

                   为什么STL和linux都采用红黑树作为平衡树的实现:https://www.zhihu.com/question/20545708

                  进程关系:父子进程之间的数据共享:http://blog.sina.com.cn/s/blog_1550922e60102z7gm.html

                 

(1)C++语言中多态的实现:一个接口,多种行为(向不同对象发送同一消息,可以产生不同的行为)

                1)编译时多态:函数的重载和模板实现,编译器在编译的时候,通过实参的个数和类型,选择最终调用的函数;

                2)运行时多态:通过虚函数实现,基类的某个成员函数为虚函数,派生类又定义一成员函数,除函数体的其余部分都与基类的成员函数相同;

                      每一个含有虚函数的类,都会生成虚表(virtual table)。这个表,记录了对象的动态类型,决定了执行此对象的虚成员函   数的时候,真正执行的那一个成员函数。

                     对于有多个基类的类对象,会有多个虚表,每一个基类对应一个虚表,同时,虚表的顺序和继承时的顺序相同。

                    在每一个类对象所占用的内存中,虚指针位于最前边,每个虚指针指向对应的虚表。

                 3)虚指针存放在内存的哪里:虚函数表是全局共享的一个元素,即全局只有一个,存放在内存的静态/全局变量区

                     函数表类似一个数组,类对象中存储vptr指针,指向虚函数表.即虚函数表不是函数,不是程序代码,不肯能存储在代码段.。

                   .虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针。

(2)STL容器的底层实现:

              1)map的底层实现用红黑树,而不用AVL

                     a)AVL是一个高度平衡的树,对树进行插入和删除更容易导致树的unbalance,因此AVL需要rebalance的概率更大,AVL插入最多也只需要两次旋转;而红黑树插入只要两次旋转,删除至多三次旋转;虽然使用AVL树搜索的效率非常稳定,但选取红黑树,是一个折中的方案;

                      b)插入一个节点导致树的不平衡,AVL和红黑树都最多只需要两次旋转操作;但删除节点引起树的不平衡,最坏情况,AVL需要维护从被删节点到root这条路径上所有节点的平衡性,因此旋转量级为O(logN),而红黑树至多需要三次旋转;

                      c)红黑树在需要大量插入和删除节点的场景下,效率更高;AVL由于高度平衡,所有搜索的效率更高;

                      d)map的实现是折中了两者在搜索,插入,删除的效率,总体来说红黑树更好;

(3)ucos操作系统和linux操作系统的区别

            参考博客:ucos ii和linux操作系统的区别:https://blog.csdn.net/chen_geng/article/details/51556459

(4)全局变量在多任务之间可以共享吗?

            1)对于多进程而言(父子进程和兄弟进程):如果其中一方调用了exec族函数(进程的代码和数据,全部替换,实际使用的物理内存也会重新申请),此时进程的代码段,数据段和堆栈都是独立的,没有任何关系;

            2)对于父子进程,其全局变量遵循“读时共享,写时独享”的原则,因此,如果在父子进程中有修改全局变量的情况,系统会再给变化的全局变量分配不同的物理内存;

            3)对于不同进程的线程,不能通过全局变量来通信;

            4)对于同一进程的线程,可以通过全局变量来铜线的,它们共享进程的代码段、数据段、BSS段。页目录和页表使用进程的页目录和页表;

(5)进程之间共享的内容有哪些?

            1)对于没有联系的进程之间的数据是相互独立的;

            2)对于父子进程:相同的地方:全局变量,堆栈,环境变量,用户id,宿主目录,进程工作目录,信号处理方式;

                                             不同的地方:进程id,fork返回值,父进程id,进程运行时间,闹钟,未决信号集;

                   可以理解成,子进程拷贝了父进程0~3G用户空间的内容,以及父进程的pcb,但是pid不同,然后再映射到物理内存;

(6)虚拟内存和物理内存的映射

            参考博客:虚拟地址和物理地址的转换:https://blog.csdn.net/a8316124/article/details/56485642   

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

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

相关文章

LeetCode 21. 合并两个有序链表 golang

递归 func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {if nil l1 {return l2}if nil l2 {return l1}if l1.Val < l2.Val {l1.Next mergeTwoLists(l1.Next, l2)return l1} else {l2.Next mergeTwoLists(l1, l2.Next)return l2} }Me(存在问题)非递归版本实现…

深信服C/C++技术一面二面20180924

技术一面&#xff1a;主要是一些关于数据结构和C/C相关的内容 1)链表和数组的相同点和不同点&#xff1b; 2&#xff09;了解静态链表吗&#xff1f;怎么用数组实现静态链表&#xff1f; 3&#xff09;使用库函数strcpy应该注意的问题有哪些&#xff1f; 4&#xff09;链表…

83. 删除排序链表中的重复元素 golang

83. 删除排序链表中的重复元素 golang Me func deleteDuplicates(head *ListNode) *ListNode {if head nil || head.Next nil {return head}result : headfor head ! nil && head.Next ! nil {for head.Val head.Next.Val {head.Next head.Next.Nextif head.Next…

《C++ Primer第五版》习题答案

博客转载&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53786215 第一章&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53200001 第二章&#xff1a; 1~10题&#xff1a;https://blog.csdn.net/misayaaaaa/article/details/53200773 11~…

《C++ Primer第五版》第一章-------IO机制和注释缩进

C Primer第一章的内容相对来说比较基础&#xff0c;主要是对C中程序编译的流程、C中的IO机制&#xff0c;for和while循环的介绍、类的构成和注释方法及缩进方法做了简要的介绍&#xff0c;本次博客主要从C中的IO机制和注释缩进等方面做一个总结记录&#xff0c;如果在总结过程中…

19.删除链表的倒数第N个节点 golang

官解 一遍写出来有难度。 [1,2] 2 [2][1,2]1 [1]func removeNthFromEnd(head *ListNode, n int) *ListNode {if n < 0 || head nil {return head}fast : headfor i : 1; i < n && fast ! nil; i{fast fast.Next}if fast nil {return head.Next}slow : headfor…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

455. 分发饼干 golang

455. 分发饼干 Me func findContentChildren(g []int, s []int) int {if len(s) 0 {return 0}sort.Ints(g)sort.Ints(s)var count, i, j int 0, 0, 0for { if g[i] < s[j] {i, j, count i1, j1, count1} else {j}if i > len(g) || j > len(s) {return count}}re…

《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结

1.using和typedef&#xff08;作用&#xff1a;定义类型别名&#xff09; 1)typedef和using都可以用来定义一个类型别名&#xff0c;二者在类型别名上定义没有区别。只是需要注意的是类型和类型别名的顺序&#xff0c;使用typedef定义类型别名的结构为 typedef 类型 类型别名&a…

204. 计数质数 golang

一次尝试&#xff0c;如何击败100%用户&#xff08;用时&#xff0c;内存&#xff09; func countPrimes(n int) int {if n 499979 {return 41537}if n 11 {return 4}if n 12 {return 5}if n 13 {return 5}if n 14 {return 6}if n 15 {return 6}if n 10 {return 4}if n …

leetcode内存消耗

leetcode内存消耗最是多少 执行用时 :0 ms, 在所有 Go 提交中击败了100.00%的用户 内存消耗 :1.9 MB, 在所有 Go 提交中击败了94.81%的用户测试链接 Test

《C++ Primer 第五版》(第2.5节,第3.1-3.4节) ——采用预处理功能编写头文件,string初始化和字符操作,vector初始化和迭代器

1.采用预处理功能编写头文件 在头文件定义(头文件中的内容是只能被定义一次的实体)过程中&#xff0c;为了防止头文件重复包含的情况&#xff0c;采用预处理器的一个头文件保护符功能,格式为&#xff1a;{ #ifndef 预处理变量(通常大写) #define 预处理变量 #end…

《C++ Primer 第五版》(第3.5-3.6节) ——C++中的内置数组类型,string对象和C风格字符串

1.C中的内置数组类型 C中的数组是内置数据类型&#xff0c;但不是基础数据类型而是构造数据类型&#xff0c;是有限个相同数据、占据着连续物理存储空间的有序集合。而内置数据类型定义的下标运算符可以处理负值运算(只要在数组范围之内)&#xff0c;这和vector及string的下标运…

793. 阶乘函数后K个零 golang

Me(AC 33 / 44 个通过测试用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …

小程序radio单选框回显

话不多说&#xff0c;效果图如下&#xff1a; 具体代码如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

172. 阶乘后的零 golang

官解 一般很难想到这个方向&#xff0c;有点类似数学归纳法&#xff1f; func trailingZeroes(n int) int {if n 0 {return 0}return trailingZeroes(n / 5) n / 5 }

《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究

1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算&#xff0c;在我看来一直是觉得只要有无符号数和有符号数的运算&#xff0c;有符号数就转化为无符号数&#xff0c;但是在《C Primer 第五版》的p142介绍&#xff0c;关于无符号数和有符号数的运算如下规定的&…

《C++ Primer 第五版》(第4.1-4.11节) ——运算符的执行顺序问题,负值坐商取余问题,数值的移位操作

1.运算符的执行顺序问题 在C语言中&#xff0c;没有明确规定大多数二元运算符的求值顺序&#xff0c;这给编译器留下了余地&#xff0c;这种策略是在代码生成效率和程序潜在缺陷之间的权衡。 对于运算符而言&#xff0c;如果运算符的两个对象中&#xff0c;存在表达式指向并修改…

543. 二叉树的直径 golang

文章目录543. 二叉树的直径example正确解法question代码&#xff08;wrong)543. 二叉树的直径 概要: 借鉴了这个题的代码。可是有一个测试用例过不去 https://blog.csdn.net/csdn_kou/article/details/104122067 example 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一…

《C++ Primer 第五版》(第4.11-4.12节)——static_cast,const_cast和reinterpret_cast类型转换, 运算符优先级表

1.static_cast,const_cast和reinterpret_cast类型转换 static_cast:强制的类型转换(不能用于底层的const转换),以前C语言中的强制类型转换都可以使用static_cast来完成。如&#xff1a;int i3; double jstatic_cast<double>(i); const_cast&#xff1a;改变底层const(指针…