知识点小结

来源:互联网 发布:淘宝信用卡避免手续费 编辑:程序博客网 时间:2024/05/17 08:45

华为:

1.      C与C++哪个性能比较好?

作者:Alan Li

链接:http://www.zhihu.com/question/19779887/answer/13534952

来源:知乎

从语言特性角度上来看,C++是C的超集。在(C++) - C的这部分语言特性中有很多会降低执行效率。一个例子是dynamic_cast,执行一个dynamic_cast要消耗100-300个CPU cycles,因为机器要跳到一段特别的snippet(一小段程序)去检查type inheritance,在内层循环中使用它无非是大大浪费时间。另一个例子是大家都很熟悉的vtable,这里不多说了。

但是一些增加了的语言特性会极大地提高编译器识别并对代码进行优化的能力。最简单的就是inline关键词。在C中程序员是不能显示地告诉编译器要不要inline某个函数,C++有了这个能力,也就是说把控制权更多地交给了写代码的人(虽然最终不一定会inline)。inline和const这两个关键词使得在global constant propagation这个编译器优化过程里,一些在底层函数中,在C里不能被全局识别的常数都能被顺利地展开,这样生成的代码必然比C要快得多。(这一段需要一些编译器优化的知识才能理解)。

通常谈语言也会比较它们的标准库,例如C++的std::sort肯定比C的qsort快(因为templatefunction的优点,甚至可以做specialization),但C++的iostream系列又比C的printf系列慢。

题外说一句,编译器很重要。说一个之前优化代码的例子:在做循环内的运算优化时,如果运算数据在内存里相邻并对齐,GCC可以检测出来并生成并行代码(在X86上是Intel SSE指令)。最终我通过数据对齐让GCC生成SIMD代码将循环速度提升了20倍。这一点上C和C++收到的效果是一样的。

网络上的评论一般认为总体而言,C++运行效率比 C 低 5% 到 10%,但是现实生活中不可能有足够巨大的工程让水平相当的程序员用 C 和 C++ 各写一遍然后比较效率,因此这些效率比较都是针对一些刻意构造的片段进行的,因此意义不大。

所以我更加觉得就这两种语言而言,效率问题视具体问题和程序员自身水平的不同而不同。所以不能简单地说C和C++哪个效率更高。它们各有各的特性,如何利用它们各自的特性生成运行效率优秀的程序,是一个程序员应该多多思考的事情。

 

 

2.      C与C++区别。

      C是面对过程的,C++是面对对象的。C++更复杂,包含有更丰富的库函数,功能相对更强大,某些方面也更随意。C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。

 

3.      A*算法

 

 

4.      UDP如何提高可靠性

UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

实现确认机制、重传机制、窗口确认机制。

如果你不利用linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:

发送:包的分片、包确认、包的重发

接收:包的调序、包的序号确认

目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。

 

个人的想法是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,谈谈自己的个人简单粗暴的设计。

1、添加seq/ack机制,确保数据发送到对端。

2、添加发送和接收缓冲区,主要是用户超时重传。

3、添加超时重传机制。

1、发送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。

2、时间到后,定时任务检查是否需要重传数据。

 

牛客网:

内存对齐:

<script src="https://code.csdn.net/snippets/2022849.js"></script>


 

 

通用型:

1.   什么是面向对象:
所谓面向对象是指,编程语言将具体的参数和函数封装为一个实体,每一个实体称之为一个对象,程序员更关心的是每个对象如何设计,以及如何处理他们之间的关系,面向对象的语言特点是支持继承和多态。

2. 什么是继承:
举个简单的例子,李嘉诚的孩子相当于拥有李嘉诚的个人财产,当然前提是这些财产被李嘉诚声明为公有的,这样李嘉诚的孩子就可以继承李嘉诚的房子,钱。但是他无法继承李嘉诚声明为私有的老婆。

3. 什么是多态:
多态就是一个事物有用的多种形态,这是面向对象的一种表现。如人这个生物,他既是一个人,又是一个动物,还是一个哺乳动物。这就是多态的表现,如果某个方法接收一个动物,我传给他一个人,方法可以执行,因为人是更高级的动物。如果一个方法接收一个人,而我传给他一个动物,那程序就无法运行,因为动物可能包含低级动物,他不包含人特有的方法和属性。

4. 什么是可变参数:
可变参数是Java5.0的新特性,具体的使用方法是当一个方法声明的时候以public void test(int ... nums)为例。参数类型后跟三个点后再跟参数名称,该方法就可以接受任意多个int类型的参数,test(1,2,3) test(1,1,1,1,1)程序都可以执行,在方法中nums可以以数组的形式进行使用。

5. 什么是反射:
反射是Java提供的一种可以根据类的名称去获取类中参数的技术,以反射类的公有方法为例,首先需要加载这个类,然后获得类的实体,接着根据方法名去获取方法的对象,最后使用invoke传方法所需的参数就可以执行,如Spring这种框架就是使用反射的技术去注入对象的。

6. 什么是内省:
内省是Java提供的操作对象属性的API,实际上内部也是使用的反射技术,只是操作起来更加的方便。内省需要使用Introspector的getBeanInfo来获取与类相关的BeanInfo,使用getPropertyDescriptors可以得到BeanInfo的所有属性,然后使用getWriteMethod或getReadMethod可以获取该属性的set或get方法,得到的是一个Method对象,通过invoke方法可以运行。

7. MVC设计模式:
MVC设计模式是:Moudle,View,Controller,分别代表模型,视图,控制器。是Web开发中最常用的设计模式,每一层只关心自己的业务特点,无需关心其他模块,降低模块与模块之间的耦合性,增加项目的可扩展性和可维护性。

8. Spring框架的主要原理:
Spring框架的核心是IOC和AOP,IOC又叫依赖注入,有些人喜欢叫控制反转。它的基本原理是通过读取配置文件,通过配置文件中配置的路径,读取文件目录下的所有Java文件,得到文件名称,依次反射这些文件,得到他们的方法和对象,对象或方法上有没有指定名称的注解,最后通过反射生成方法的实体给指定的对象赋值。

AOP又叫面向切面的编程,它可以降低业务之间的耦合度,如日志记录,事务控制,异常处理等等。可以在方法前或方法后做一些操作,它的基本原理是使用Java的动态代理API,通过API获得指定方法的代理对象,通过再代理对象方法执行前后增加方法,可以达到在不改变类本身的情况下,灵活在某些方法执行前后增加其他方法。

9. 什么是泛型:
泛型是JDK5.0中提供的一种新特性,当我们的方法,接受不确定类型的参数时,可以使用特殊变量T,T在使用之前要在方法中进行声明如:public <T> T getObj(T t)这个对象代表,接收一个任意类型的参数,并且返回这个类型的参数。Map集合声明时接收的key和value就是泛型,泛型作用在类上时,即可使用Map<String,String>这种形式进行泛型赋值。

10. 如何声明一个注解:
注解是Java中一个为了取代配置文件的技术,常见的注解有@Override,@Test等,声明一个注解只需要新建一个类,以Imooc注解为例,public @interface Imooc{} 即可声明一个名为Imooc的注解。内部可以以参数类型 参数名()的形式来声明注解中所需要的参数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击