阿里云2011.9.17招聘会笔试题
1、?堆和棧的區別?
答:1、棧區(stack)—?? 由編譯器自動分配釋放?? ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
??????? 2、堆區(heap) 一般由程序員分配釋放,?? 若程序員不釋放,程序結束時可能由OS回收?? 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。?
??????? 3、棧是向下增長的,堆是向上增長的。(可以參考上一篇博客)
下面是一個例子程序:
//main.cpp int a = 0; //全局初始化區 char *p1; //全局未初始化區 void main() {int b; //棧 char s[] = "abc"; //棧 char *p2; //棧 char *p3 = "123456"; // 123456\0在常量區,p3在棧上。 static int c=0; //全局(靜態)初始化區 p1 = (char *)malloc(10); //在堆上動態開辟空間 p2 = (char *)malloc(20); //分配來的10和20字節的區域就在堆區。 strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456" 優化成一個地方。 }申請方式不同:??
? stack:?由系統自動分配。速度較快。但程序員是無法控制的。?? 例如,在函數中聲明一個局部變量?? int?? b;?? 系統自動在棧中為b開辟空間?
? heap:? 需要程序員自己申請,并指明大小,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。在c中malloc函數。?
? 如p1?? =?? (char?? *)malloc(10);??
? 在C++中用new運算符??
? 如p2?? =?? new?? char[10];??
? 但是注意p1、p2本身是在棧中的。???
?2、進程和線程區別?
線程是指進程內的一個執行單元,也是進程內的可調度實體.
與進程的區別:
(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是。4)二者均可并發執行。
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。進程和線程的區別:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。
線程的劃分尺度小于進程,使得多線程程序的并發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行。
3、C語言中兩種方式使用#include命令,#include <>與#include ””的區別是什么?
答:"#include <stdlib.h> ” 用于標準庫文件或系統提供的頭文件,到保存系統標準頭文件的位置查找頭文件。
而"#include "userdefined.h"用于用戶自定義的頭文件,先從當前目錄查找是否有指定名稱的頭文件,若當前目錄未找到該頭文件,再從標準文件目錄中查找。這兩種方式有他們的本質區別。
在c語言程序設計中包含的頭文件可分為系統標準頭文件和用戶工程中自定義的頭文件,對于系統標準庫頭文件可以用這兩種方式進行包含,但是采用第一種方式更節省時間,所以一般建議采用第一種方式。對于用戶自己定義的頭文件(保存在工程路徑下)只能用第二種方式進行包含操作,否則出錯(當然也可以把自己定義的工程中需要的頭文件放在標準頭文件路徑下,但是這違背常規操作)。
4、抽象類為什么不能實例化?
抽象類中的純虛函數沒有具體的實現,所以沒辦法實例化。
5、設計模式:工廠模式 和 單例模式 介紹一下?
工程模式即將對象創建過程封裝即為工廠模式。
單例模式即整個類只有一個對象,并且不允許顯示創建。
6、vector 和 list的區別?
vector內部使用順序存儲,訪問速度快,但是刪除數據比較耗性能。
list內部使用鏈式存儲,訪問速度慢,但是刪除數據比較快。
7、純虛函數是怎樣實現的?在編譯原理上講一下?
答:在類內部添加一個虛擬函數表指針,該指針指向一個虛擬函數表,該虛擬函數表包含了所有的虛擬函數的入口地址,每個類的虛擬函數表都不一樣,在運行階段可以循此脈絡找到自己的函數入口。
8、兩個線程,幾個變量,線程執行次序不確定,某個變量的可能取值。。
9、hash沖突時候的解決方法?
1)、開放地址法
2)、再哈希法
3)、鏈地址法
4)、建立一個公共溢出區
10、單鏈表的倒置。
//逆轉鏈表,并返回逆轉后的頭節點 node* reverse(node *head) {if(head == NULL || head->next == NULL){return head;}node *cur = head;node *pre = NULL;node *tmp;while(cur->next){tmp = pre;pre = cur;cur = cur->next;pre->next = tmp; //操作pre的next逆轉}cur->next = pre; //結束時,操作cur的next逆轉return cur; }
?
總結
以上是生活随笔為你收集整理的阿里云2011.9.17招聘会笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序在内存中的分布
- 下一篇: 操作系统各大公司笔试题汇总