笔试题:(ABC)
1、 32位系统下, C++程序,请计算sizeof 的值?
char str[] = “www.sumavision.com”
char *p = str ;
int n = 2010;
请计算:sizeof (str ) = ?sizeof ( p ) = ?sizeof ( n ) = ?
答:(1)19 (2)4 (3) 4
2、 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
3、 请说明C++中栈(stack)和堆(heap)的区别,new和malloc申请的内存在栈上还是在堆上?
答:
a) 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
b) 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时由操作系统回收,可能会产生碎片。 New和malloc申请的内存在堆上。
4、 请说明在程序中使用线程的好处是什么?
答:
a) 耗时的操作使用线程,提高应用程序响应
b) 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
c) 多CPU系统中,使用线程提高CPU利用率
d) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
5、 请问如何防止程序运行过程中同时产生大量的线程?
答:方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。
6、 如果ORACLE数据库日志满了,会出现什么情况,是否还能使用?
答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志,也就是说数据库基本上处于不能使用的状态。
7、 如何实现在操作ORACLE数据库一张表的同时也操作另一张表?
答:把多个表的操作放入到事务中进行处理。
8、 请说明C++中动态链接库和静态链接库的区别?
答:
a) 动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,当程序运行时直接从操作系统中找,动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入;
b) 静态链接就是把所有用到的函数全部链接到exe文件中,所有的代码和数据都复制到本模块中,运行时就不再需要库了。
9、 请说明调用动态链接库DLL的2种方式?
答:
a) 载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
b) 运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用 GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。
10、 请说明TCP/IP 建立连接的过程?
答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
a) 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
b) 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
c) 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
评论列表
文章目录