工作准备笔记一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengzy1990/article/details/51154025

1、堆栈的区别?   

堆栈是两种数据结构,堆是队列优先,先进先出,堆可以看成一棵树。栈是先进后出。堆一般由程序员分配和释放,栈是由操作系统自动分配和释放,存放函数的参数值、局部变量的值等;

auto,采用堆栈方式分配内存,register存放在寄存器,extern所有程序段和函数都可使用,static内存中以固定地址存放,整个程序运行中都有效。

在java中堆(heap)内存数据区,用来保存对象的实例,对象在堆中分配号以后会在栈中保存一个4字节的堆内存地址;栈(stack)JVM的内存指令区,java的基本数据类型,java的指令代码,常量都保存在栈中。

2、inline内联函数和宏

C程序中可以用宏代码提高执行效率,宏本身不是函数,编译器处理器用拷贝宏代码方式取代函数调用取代函数调用,省去了参数压站、汇编语言的CALL调用、返回参数、return等过程,提高了速度。使用宏代码的最大缺点是容易出错,可能产生意想不到的边际效应,宏不可以调试,内联函数可以调试,函数内联之后可以通过上下文相关的优化技术对结果代码执行更深入的优化。

一下情况不宜使用内联:内联代码比较长的,会导致执行代码膨胀过大,如果函数体出现循环或者其他复杂控制结构,执行内联代码将比函数调用的开销大得多。

Google C++中规范中只有当函数只有10行之内时才将其定义为内联函数

3、引用相关知识

引用实际是某一变量的别名,对引用的操作与对应边变量操作完全一样。如果想利用引用提高程序效率又要保护传递的数据不被改变,就应使用常引用,声明方式: const 类型标识符 &引用名=目标变量名。

引用作为函数参数在内存中并没有产生副本,直接对实参操作,一般变量会为形参分配存储单元,如果传递对象还会调用复制构造函数,因此,在传递参数比较大时,引用会比一般参数效率要高,虽然使用指针作为参数也能达到引用效果,但是,在被调函数中同样要给形参分配存储单元,且要重复使用“*指针变量名”来运算,程序阅读性较差。

如果将“引用”作为函数返回值类型, 类型标识符 &函数名(形参表){/函数体},这样在内存中不产生被返回值的副本;但是不能返回局变量的引用(会在函数返回后销毁),不能返回函数内部new分配的内存;

引用也是除指针外另一钟产生多态的手段。意味着,一个基类的引用可以指向它的派生类实例。

4、New delete 与 mallocfree联系与区别、输出文件名及当前行号

都是在堆上进行动态内存操作,malloc需要制定内存分配的字节数并且不能初始化对象,new会自动调用对象的构造函数。delete会调用对象的析构函数,free只是释放内存空间,比调用析构函数。

cout<<__FILE__<<endl;cout<<__LINE__<<endl;__FILE__和__LINE__是系统预定义宏。

5、C++中引用编译过的C代码为什么要加“extern C”

C++支持函数重载,C不支持函数重载,所以被C++和C编译过后的名字不同。C只是用函数名来表示,C++支持函数重载所以还需要结合参数来表示,引入“extern c”用来解决函数命名不匹配问题;

下面解释下extern关键字,用以表示变量或函数定义在别的文件中,提示编译器在遇到时,在其他模块中寻找定义。

3、Android询问listview的优化问题

使用Adapter提供的convertView的视图缓存机制,第一次显示数据的时候,会创建n个cconvertView,当下次需要更新item的时候,adapter会循环利用已经创建的convertView。如果加载的图片过大,可以使用缩略图,还可以使用弱引用WeakReference; 利用viewholder模式

4、Fragement  标签页 JNI

5、Android的Sqlite数据库

第一步MySqlite extends SqliteOpenHelper类,实现里面构造函数,onCreate(),onUpgrade()方法

MySqlite mysqlite =newMySqlite(this); 

SqliteDatabasedb=mysqlite.getWritableDatabase();

6、缓存的更新,下载图片等问题

可以使用Android中的LruCache;

一、二级缓存工作机制:所谓二级缓存就是,当Android端需要获取数据比如网上图片,首先从内存中查找(按值查找),内存中没有再从磁盘文件或sqlite中去查找,或都没有从网上下载;当获得来自网络的数据,就以key-value对的方式先缓存到内存(一级缓存),同时缓存到文件或sqlite中(二级缓存),同时AsimpleCache是一个轻量级的的cache框架实现二级缓存,实际上是ACache的java类。下载地址:https://github.com/yangfuhai/ASimpleCache

7、什么是多态

多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。多态在c++都是通过虚函数实现的,简单一句话就是允许将子类类型的指针赋值给父类类型的指针;

C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模版(重载与多态无关)。  多态的作用:1.隐藏实现细节,是的代码能够模块化,扩展模块及代码重用。2.接口重用,保证家族中任一类的实例的属性正确调用。

重载是一个类内的多个同名方法,重写是子类重写覆盖父类的方法。

8、TCP

 TCP的连接过程和断开过程:通过三次握手实现连接

(1)客户端发送一个SYN包给服务器,然后等待应答。

(2)服务器端回应给客户端一个ACK、SYN的TCP数据段。

(3)客户端收到服务器的SYN报文,必须再次回应服务器端一个ACK确认数据段。

释放连接(四次挥手)这是由TCP的半关闭(half-close)造成的

(1) 某个应用首先关闭,该端为主动关闭active close。该端的TCP发送一个FIN

(2) 接收到这个FIN端执行被动关闭passive close,这个FIN由TCP确认。
(3) 一段时间后,接收到文件结束符的应用进程调用close关闭它的套接字并发送FIN
(4) 接收到这个最终的FIN的原发送端TCP确认这个FIN

9、关于SQL的复习

①什么是存储过程: 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,只需创建一次,以后可以多次调用,存储过程比淡出SQL语句执行要快,可以用一个命令帝乡来调用存储过程

②触发器: 是一种特殊的存储过程,通过事件触发被执行。强化约束,来维持数据的一致性和完整性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。

③索引:索引就是一种特殊的查询表,可以提高数据的检索。缺点是减慢了数据录入速度,增加了数据库的尺寸大小

④事务:被绑定在一起作为一个工作单元的SQL语句分组;锁:可以保证事务的完整性和并发性;视图:是一种虚拟的表,具有和物理表相同的功能,可以增删改查,不影响基本表;游标:是对查询出来的结果集作为一个单元来有效的处理,可以的定在该单元中的特定行,从结果集的当前行检索一行或多行

⑤日志:记录对数据库数据的修改,主要是保护数据库以防止故障,以及恢复数据时使用。

归档日志文件:重要日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复。

10、设计模式

单例模式 要点有三个:某个类只能有一个实例,二是它必须自行创建这个实例,三是它必须自行向整个系统提供这个实例;具体就是单例模式的类只能供私有构造函数,含有一个该类的静态私有对象,该类提供一个静态共有的函数用于创建或获取它本身的静态私有对象。

享元模式:采用一个共享来避免大量拥有相同内容对象的开销

简单工厂模式:又称为静态工厂方法模式,通过定义一个专门类来负责创建其他类的实例

#i nclude

Container Class

<deque>

deque

<list>

list

<map>

map, multimap

<queue>

queue, priority_queue

<set>

set, multiset

<stack>

stack

<vector>

vector, vector<bool>

观察者模式(Observer):定义了一对多的依赖关系,多个观察者同时监听同一对象,当这个主题对象发生变化时,会通知所有观察者对象,让他们能够自动更新自己。

11、开闭原则

开闭原则的核心是:对扩展发放,对修改关闭;通过扩展的方式来达到软件的改变,而不修改原有代码来实现。

12、STL简介

STL的重要特点就是数据结构和算法的分离,另一重要特性它不是面向对象的,STL主要依赖于模板而不是封装,提供了大量的模板类和函数;右边的表格为容器;迭代器提供了对一个容器中对象的访问方法以及对象的范围。

13、 LINUX下系统调用的三种方法及文件操作方式

一通过glibc提供的库函数,glibc是Linux下使用的开源的标准c库,它是GNU发布的libc库;二使用syscall直接调用;三通过int指令。

Linux下对文件操作方式有系统调用(system call)和库函数调用(Library functions)。系统调用实际上是指最底层的一个调用,面向的硬件。库函数调用面向的是应用开发,相当于应用程序的api,采用这样的方式原因有双缓冲技术的实现、可移植性、底层调用本身的一些性能方面缺陷。

猜你喜欢

转载自blog.csdn.net/fengzy1990/article/details/51154025