参考自:《鹅厂实习生客户端笔试》
1.下列减少内存碎片的方法有哪些是正确的?
增加实际申请和释放的次数
频繁调用的子函数尽量使用栈内存
系统申请一大块内存,自己实现内存分配和释放,定时清理内存
降低虚拟内存的大小
解答:
答案2,3是正确的。属于操作系统中内存管理的问题。
C/C++中的malloc/free是从堆中动态申请和释放内存的,是非常耗时的;
栈内存速度比堆内存快,因为栈结构简单,只需要弹出或者入栈就可以移动指针了,而在堆中,需要查找空闲内存,申请内存等操作,所以比较慢;
分配一大块内存池,然后自己进行管理,有经验的程序员是可以做到的,比如在nginx中,它就首先分配了很多的内存,然后再重写malloc/free进行自主管理的;
关于虚拟内存,肯定是越多越好啊,升级64位最显著的优势就是可以使用64EB的内存。
考点:Stack与Heap的区别:
考点:虚拟内存(Virtual memory)
在32位Unix下,进程启动后,可以获取到4GB的虚拟内存,其中内核占用1G,用户占用3G,虚拟内存是通过物理内存(physical memory)与交换空间(swap)进行分配的,它对于进程是透明的,系统通过地址转换功能(比如MMU,内存管理单元)进行虚拟内存与实际内存的转换。
什么是内存碎片?
内部碎片: 线程占用内存而不利用或者释放的内存空间。
外部碎片: 内存空间太小以至于无法分配的内存空间。
2.以下哪些是HTTP协议里面定义的URL组成部分:
schema
path
port
host
query-string
解答:
这道题答案是除第一个以外。考的是实际中对网络编程的理解。
URL实际上就是是对资源的一种描述:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]<query-string>
scheme 指协议类型,常见的协议类型有market,http,content,media,file,当然协议类型也可以自定义,比如简书中使用的就是 jianshu作为默认URL的。
注意这里的 scheme 不是 schema
比如HTTP-GET的例子:
http://www.blackswift.com:8080/api/v2/getimagelist?limit=10
很显然,这个HTTP例子中除了HTTP本身已经有了,其它所有的组成都有体现。
3.已知人脸检测器的检出率(人脸图被检测为人脸的概率)为90%,误检率(非人脸被检测为人脸的概率)为1%. 请问当一张被人脸检测器识别为人脸时,该图为人脸图的概率是多少?若给定一个图片集中,其中20%的图片为人脸图,80%的图为非人脸图,当该集合中的某一张图被人脸检测器检测为人脸时,该图为人脸的概率又是多少?
- 无法确定, 45/47
- 90/91, 45/47
- 无法确定,90/91
- 90/91,90/91
解答:
选择1;
第一问,
A = P(图片是人脸);
B = P(机器检测出人脸);
P(B|A) = 90%;
P(B|~A) = 1%;
P(B) = P(B|A)xP(A) + P(B|~A)* P(~A) = 0.9A + 0.01(1-A);
根据贝叶斯公示:
P(A|B) = P(B|A) * P(A)/P(B)
= 0.9 * P(A)/(0.89A + 0.01)
A为止,所以无法确定。
第二问,
P(A) = 0.2,代入完成。
4.iOS开发中,非ARC下这段代码执行的结果是什么?
//类似于Java,用注解定义接口
@interface OCObject : NSObject
-(void)printDescription;
@end
//接口的实现
@implementation OCObject
-(void)printDescription{
NSLog(@”OCObject printDescription!”);
}
@end
//手动分配内存,alloc并init
OCObject *obj = [[OCObject alloc]init];
//执行方法,performSelector
类似于Java中的反射,也是在运行时找的。
[obj performSelector:@selector(printDescription) withObject:nil afterDelay:60];
[obj release];
1. 不会打出任何消息
2. 会输出OCObject printDesc