版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、虛函數(shù) 用于動態(tài)聯(lián)編,是在運行是通過類型來覺得函數(shù)的調(diào)用而構(gòu)造函數(shù) 是在類型完成內(nèi)存分配之前調(diào)用的,不可能知道是哪個類型,所以不能為 虛函數(shù)static有什么用途:限制變量的作用域;設(shè)置變量的存儲域。4) 用戶進(jìn)程間通信主要哪幾種方式?(1)管道( pipe ):管道可用于具有親緣關(guān)系進(jìn)程間的通信,允許一個進(jìn)程和另一個與它有共同祖先的進(jìn)程之間進(jìn)行通信。(2)命名管道( named pipe ):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外, 它還允許無親緣關(guān)系進(jìn)程間的通信。命名管道在文件系統(tǒng)中有對應(yīng)的文件名。命名管道通過命令mkfifo 或系統(tǒng)調(diào)用mkfifo 來創(chuàng)建。(3
2、)信號( signal ):信號是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號給進(jìn)程本身;linux 除了支持 unix 早期信號語義函數(shù) sigal 外,還支持語義符合posix.1 標(biāo)準(zhǔn)的信號函數(shù)sigaction (實際上,該函數(shù)是基于 bsd 的, bsd 為了實現(xiàn)可靠信號機制,又能夠統(tǒng)一對外接口,用sigaction 函數(shù)重新實現(xiàn)了 signal 函數(shù))。(4)消息( message )隊列:消息隊列是消息的鏈接表,包括posix 消息隊列system v消息隊列。 有足夠權(quán)限的進(jìn)程可以向隊列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊列
3、中的消息。 消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺(5)共享內(nèi)存:使得多個進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的可用ipc 形式。是針對其他通信機制運行效率較低而設(shè)計的。往往與其它通信機制,如信號量結(jié)合使用,來達(dá)到進(jìn)程間的同步及互斥。(6)信號量( semaphore ):主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。(7)套接字( socket ):更為一般的進(jìn)程間通信機制,可用于不同機器之間的進(jìn)程間通信。起初是由 unix 系統(tǒng)的 bsd 分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類unix 系統(tǒng)上:linux 和 system v 的變種都支持套接
4、字。使用自旋鎖需要謹(jǐn)慎,特別要注意以下幾個問題:自旋鎖實際上是忙等鎖,當(dāng)鎖不可用時,cpu 一直循環(huán)執(zhí)行 測試并設(shè)置 直到可以取得該鎖, cpu 在等待自旋鎖時不做任何有用的工作,僅僅是等待。因此,只有在占用鎖時間極短的情況下,使用自旋鎖才是合理的。當(dāng)臨界區(qū)很大或有共享設(shè)備的時候,需要較長時間占用鎖,使用自旋鎖會降低系統(tǒng)的性能。自旋鎖可能導(dǎo)致系統(tǒng)死鎖。引發(fā)這個問題最常見的情況是遞歸使用一個自旋鎖,即如果一個已經(jīng)擁有某個自旋鎖的 cpu 想第 2 次獲得這個鎖,則該 cpu 死鎖。此外,如果進(jìn)程獲得自旋鎖后再阻塞,也有可能導(dǎo)致死鎖的發(fā)生copy_from_user()、copy_to_user(
5、) 和 kmalloc() 等函數(shù)都有可能引起阻塞,因此在自旋鎖的占用期間不能調(diào)用這些函數(shù)。1、 什么是中斷?中斷時cpu 做什么工作?中斷是指在計算機執(zhí)行期間,系統(tǒng)內(nèi)發(fā)生任何非尋常的或非預(yù)期的急需處理事件,使得 cpu暫時中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的事件處理程序。待處理完畢后又返回原來被中斷處繼續(xù)執(zhí)行或調(diào)度新的進(jìn)程執(zhí)行的過程請簡述以下兩個for 循環(huán)的優(yōu)缺點:(16 分) ( 1)for (i = 0; i n; i+) if (condition) dosomething(); elsedoothers(); (2)if (condition) for (i = 0; i n;
6、i+) dosomething(); elsefor (i = 0; i n; i+) doothers(); (1) 優(yōu)點:程序簡潔;(4 分缺點:多執(zhí)行了 n-1 次邏輯判斷, 并且打斷了循環(huán) “流水線” 作業(yè),使得編譯器不能對循環(huán)進(jìn)行優(yōu)化處理,降低了效率。 (4 分) (2) 優(yōu)點:循環(huán)的效率高;(4 分) 缺點:程序不簡潔。(4 分) tcp/ip (transmission control protocol/internet protocol的簡寫,中文譯名為傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議)協(xié)議是 internet最基本的協(xié)議,簡單地說,就是由底層的ip 協(xié)議和 tcp 協(xié)議組成的。 t
7、cp/ip 協(xié)議是一組包括 tcp (傳輸控制協(xié)議) 協(xié)議和 ip (網(wǎng)際協(xié)議) 協(xié)議,udp (user datagram protocol) 協(xié)議、icmp (internet control message protocol )協(xié)議和其他一些協(xié)議的協(xié)議組。傳統(tǒng)7 層是 :物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話路層、表示層和應(yīng)用層。而tcp/ip 通訊協(xié)議采用了4 層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求:a) 應(yīng)用層:應(yīng)用程序間溝通的層,如簡單電子郵件傳輸(smtp) 、文件傳輸協(xié)議( ftp) 、網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議( telnet)和 http 等。b) 傳輸層:
8、 在此層中, 它提供了節(jié)點間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議 (tcp) 、用戶數(shù)據(jù)報協(xié)議 (udp)等,tcp和 udp 給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又?,這一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。c) 互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(但不檢查是否被正確接收),如網(wǎng)際協(xié)議( ip) 。d) 網(wǎng)絡(luò)接口層:對實際的網(wǎng)絡(luò)媒體的管理,定義如何使用實際網(wǎng)絡(luò)(如ethernet 、serial line 等)來傳送數(shù)據(jù)。http :超文本傳輸協(xié)議(http)是應(yīng)用層協(xié)議,由于其簡捷、快速的方式,適用于分布式和合作式超媒體信息系統(tǒng)。 http 允許
9、使用自由答復(fù)的方法表明請求目的,它建立在統(tǒng)一資源識別器(uri)提供的參考原則下,作為一個地址(url)或名字( urn) ,用以標(biāo)志采用哪種方法,它用類似于網(wǎng)絡(luò)郵件和多用途網(wǎng)際郵件擴(kuò)充協(xié)議( mime )的格式傳遞消息。http 是一種請求 /響應(yīng)式的協(xié)議dns 是指(域名系統(tǒng)domain name system ) 。請用簡單語言描述其工作原理。當(dāng) dns 客戶機需要查詢程序中使用的名稱時,它會查詢dns 服務(wù)器來解析該名稱??蛻魴C發(fā)送的每條查詢消息都包括3 條信息,以指定服務(wù)器應(yīng)回答的問題。1 指定的dns 域名,表示為完全合格的域名(fqdn) 。2 指定的查詢類型,它可根據(jù)類型指定資
10、源記錄,或作為查詢操作的專門類型。3 dns 域名的指定類別。簡述 dns 進(jìn)行域名解析的過程。參考答案:首先,客戶端發(fā)出dns 請求翻譯ip 地址或主機名。dns 服務(wù)器在收到客戶機的請求后:(1)檢查 dns 服務(wù)器的緩存,若查到請求的地址或名字,即向客戶機發(fā)出應(yīng)答信息;(2)若沒有查到,則在數(shù)據(jù)庫中查找,若查到請求的地址或名字,即向客戶機發(fā)出應(yīng)答信息;(3)若沒有查到,則將請求發(fā)給根域dns服務(wù)器,并依序從根域查找頂級域,由頂級查找二級域,二級域查找三級,直至找到要解析的地址或名字,即向客戶機所在網(wǎng)絡(luò)的dns服務(wù)器發(fā)出應(yīng)答信息,dns 服務(wù)器收到應(yīng)答后現(xiàn)在緩存中存儲,然后,將解析結(jié)果發(fā)給
11、客戶機。(4)若沒有找到,則返回錯誤信息。問: 3,internet上保留了哪些內(nèi)部ip 有可以供使用?可以使用 或 172.16 直 172.31 或 192.168.0 直 192.168.2 6:tcp 為何采用三次握手來建立連接,若采用二次握手可以嗎,請說明原因?(16 分)三次握手是為了防止已失效的連接請求再次傳送到服務(wù)器端。二次握手不可行,因為:如果由于網(wǎng)絡(luò)不穩(wěn)定,雖然客戶端以前發(fā)送的連接請求以到達(dá)服務(wù)方,但服務(wù)方的同意連接的應(yīng)答未能到達(dá)客戶端。則客戶方要重新發(fā)送連接請求,若采用二次握手,服務(wù)方收到重傳的請求連接后,會以為是新的請求,就會發(fā)送同意連接報文,并新開進(jìn)
12、程提供服務(wù),這樣會造成服務(wù)方資源的無謂浪費。.tcp/ip 建立連接的過程?(3-way shake) 答案:在 tcp/ip 協(xié)議中, tcp 協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個連接。第一次握手:建立連接時,客戶端發(fā)送syn 包(syn=j) 到服務(wù)器,并進(jìn)入syn_send 狀態(tài),等待服務(wù)器確認(rèn);第二次握手:服務(wù)器收到syn 包,必須確認(rèn)客戶的syn(ack=j+1 ) ,同時自己也發(fā)送一個syn 包(syn=k ) ,即 syn+ack 包,此時服務(wù)器進(jìn)入syn_recv狀態(tài);第三次握手:客戶端收到服務(wù)器的synack 包,向服務(wù)器發(fā)送確認(rèn)包ack(ack=k+1),此包發(fā)送完
13、畢,客戶端和服務(wù)器進(jìn)入established 狀態(tài),完成三次握手。華為面試題static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別? static函數(shù)與普通函數(shù)有什么區(qū)別?(20 分) static全局變量與普通全局變量的區(qū)別:static 全局變量只初使化一次,防止在其他文件單元中被引用 ;前者在主函數(shù)之前就要被初始化,(2 分) 后者無要求。 (2分)static局部變量和普通局部變量的區(qū)別:static 局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值; static全句變量是所有函數(shù)共享的變量,在一個函數(shù)使用完它后它的值會保持到下一個函數(shù)來改變它(2
14、 分) 。后者,本函數(shù)所聲明的局部變量在本函數(shù)運行完之后會被銷毀。(2 分)static函數(shù)與普通函數(shù)的區(qū)別: static的可以用類來訪問(就是不用初始化一個類就直接使用這個類的這個static方法);(2 分) 非 static的只能通過對象來訪問 (2 分) 。 static的定義里不能用到類內(nèi)部非static變量值。(3 分)static在循環(huán)中定義并賦值時, 定義過程只進(jìn)行一次, 而不是每個循環(huán) 1 次。 (3 分) static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝. q1:請你分別劃劃 osi 的七層網(wǎng)絡(luò)結(jié)構(gòu)圖,和tcp/ip 的五層結(jié)構(gòu)圖?、 1、osi 每層
15、功能及特點a 物理層為數(shù)據(jù)鏈路層提供物理連接,在其上串行傳送比特流,即所傳送數(shù)據(jù)的單位是比特。此外,該層中還具有確定連接設(shè)備的電氣特性和物理特性等功能。 b 數(shù)據(jù)鏈路層負(fù)責(zé)在網(wǎng)絡(luò)節(jié)點間的線路上通過檢測、流量控制和重發(fā)等手段,無差錯地傳送以幀為單位的數(shù)據(jù)。為做到這一點,在每一幀中必須同時帶有同步、地址、差錯控制及流量控制等控制信息。c 網(wǎng)絡(luò)層為了將數(shù)據(jù)分組從源(源端系統(tǒng))送到目的地(目標(biāo)端系統(tǒng)),網(wǎng)絡(luò)層的任務(wù)就是選擇合適的路由和交換節(jié)點,使源的傳輸層傳下來的分組信息能夠正確無誤地按照地址找到目的地,并交付給相應(yīng)的傳輸層,即完成網(wǎng)絡(luò)的尋址功能。/ d 傳輸層傳輸層是高低層之間銜接的接口層。數(shù)據(jù)傳輸
16、的單位是報文,當(dāng)報文較長時將它分割成若干分組,然后交給網(wǎng)絡(luò)層進(jìn)行傳輸。傳輸層是計算機網(wǎng)絡(luò)協(xié)議分層中的最關(guān)鍵一層,該層以上各層將不再管理信息傳輸問題。 e 會話層該層對傳輸?shù)膱笪奶峁┩焦芾矸?wù)。在兩個不同系統(tǒng)的互相通信的應(yīng)用進(jìn)程之間建立、組織和協(xié)調(diào)交互。例如,確定是雙工還是半雙工工作。f 表示層該層的主要任務(wù)是把所傳送的數(shù)據(jù)的抽象語法變換為傳送語法,即把不同計算機內(nèi)部的不同表示形式轉(zhuǎn)換成網(wǎng)絡(luò)通信中的標(biāo)準(zhǔn)表示形式。此外,對傳送的數(shù)據(jù)加密(或解密)、正文壓縮(或還原)也是表示層的任務(wù)。 g 應(yīng)用層該層直接面向用戶,是osi 中的最高層。它的主要任務(wù)是為用戶提供應(yīng)用的接口,即提供不同計算機間的文件傳
17、送、訪問與管理,電子郵件的內(nèi)容處理,不同計算機通過網(wǎng)絡(luò)交互訪問的虛擬終端功能等。2、tcp/ip a 網(wǎng)絡(luò)接口層這是 tcp/ip 協(xié)議的最低一層,包括有多種邏輯鏈路控制和媒體訪問協(xié)議。網(wǎng)絡(luò)接口層的功能是接收ip 數(shù)據(jù)報并通過特定的網(wǎng)絡(luò)進(jìn)行傳輸,或從網(wǎng)絡(luò)上接收物理幀,抽取出 ip 數(shù)據(jù)報并轉(zhuǎn)交給網(wǎng)際層。b 網(wǎng)際網(wǎng)層(ip 層)該層包括以下協(xié)議: ip (網(wǎng)際協(xié)議) 、 icmp(internet control message protocol, 因特網(wǎng)控制報文協(xié)議)、arp ( address resolution protocol,地址解析協(xié)議)、rarp ( reverse addres
18、s resolution protocol,反向地址解析協(xié)議)。該層負(fù)責(zé)相同或不同網(wǎng)絡(luò)中計算機之間的通信,主要處理數(shù)據(jù)報和路由。在 ip 層中 ,arp 協(xié)議用于將ip 地址轉(zhuǎn)換成物理地址,rarp 協(xié)議用于將物理地址轉(zhuǎn)換成ip 地址, icmp 協(xié)議用于報告差錯和傳送控制信息。 ip 協(xié)議在 tcp/ip 協(xié)議組中處于核心地位。c 傳輸層該層提供tcp (傳輸控制協(xié)議)和udp (user datagram protocol,用戶數(shù)據(jù)報協(xié)議)兩個協(xié)議,它們都建立在ip 協(xié)議的基礎(chǔ)上,其中tcp 提供可靠的面向連接服務(wù), udp 提供簡單的無連接服務(wù)。傳輸層提供端到端,即應(yīng)用程序之間的通信,主
19、要功能是數(shù)據(jù)格式化、數(shù)據(jù)確認(rèn)和丟失重傳等。d 應(yīng)用層tcp/ip 協(xié)議的應(yīng)用層相當(dāng)于osi 模型的會話層、表示層和應(yīng)用層,它向用戶提供一組常用的應(yīng)用層協(xié)議,其中包括: telnet 、smtp 、dns 等。此外,在應(yīng)用層中還包含有用戶應(yīng)用程序,它們均是建立在tcp/ip 協(xié)議組之上的專用程序。3、osi 參考模型和tcp/ip 參考模型的區(qū)別:a osi 模型有 7 層, tcp/ip 只有 4 層;b osi 先于協(xié)議出現(xiàn),因此不會偏向于任何一組特定的協(xié)議,通用性更強,但有些功能不知該放哪一層上, 因此不得不加入一些子層;tcp/ip 后于協(xié)議出現(xiàn), 僅是將已有協(xié)議的一個描述,因此兩者配合
20、的非常好;但他不適合其他的協(xié)議棧,不容易描述其他非tcp/ip 的網(wǎng)絡(luò);c osi 中網(wǎng)絡(luò)層同時支持無連接和面向連接的通信,但在傳輸層上只支持面向連接的通信;tcp/ip 中網(wǎng)絡(luò)層只支持無連接通信,傳輸層同時支持兩種通信;d 在技術(shù)發(fā)生變化時,osi 模型比 tcp/ip 模型中的協(xié)議更容易被替換q2:請你詳細(xì)的解釋一下ip 協(xié)議的定義,在哪個層上面, 主要有什么作用?tcp 與 udp 呢?ip 協(xié)議( internet protocol,因特網(wǎng) 協(xié)議),屬于osi7 層參考模型中的網(wǎng)絡(luò)層 協(xié)議。它提供兩個基本功能:尋址和分段。 尋址即常說的路由功能;分段是指對數(shù)據(jù)包的大小進(jìn)行重新組裝,以適
21、應(yīng)不同網(wǎng)絡(luò)對包大小的要求。速度快q3:請問交換機和路由器分別的實現(xiàn)原理是什么?分別在哪個層次上面實現(xiàn)的?q4:請問 c+的類和 c 里面的 struct有什么區(qū)別?a4:c+中的類具有成員保護(hù)功能,并且具有繼承,多態(tài)這類oo 特點,而 c 里的struct 沒有q5:請講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用?a5:析構(gòu)函數(shù)一般在對象撤消前做收尾工作,比如回收內(nèi)存等工作,虛擬函數(shù)的功能是使子類可以用同名的函數(shù)對父類函數(shù)進(jìn)行重載,并且在調(diào)用時自動調(diào)用子類重載函數(shù),如果是純虛函數(shù),則純粹是為了在子類重載時有個統(tǒng)一的命名而已。(說得不是很確切,自己隨便找本c+的書都有說明)q6:全局變量和局部變量有什么區(qū)
22、別?實怎么實現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道的?a6:全局變量的生命周期是整個程序運行的時間,而局部變量的生命周期則是局部函數(shù)或過程調(diào)用的時間段。其實現(xiàn)是由編譯器在編譯時采用不同內(nèi)存分配方法。全局變量在main 函數(shù)調(diào)用后,就開始分配,如果是靜態(tài)變量則是在main函數(shù)前就已經(jīng)初始化了。 而局部變量則是在用戶棧中動態(tài)分配的(還是建議看編譯原理中的活動記錄這一塊)q8:8086是多少位的系統(tǒng)?在數(shù)據(jù)總線上是怎么實現(xiàn)的?a8:8086 系統(tǒng)是 16 位系統(tǒng),其數(shù)據(jù)總線是20 位,實現(xiàn)過程,微機原理上有,我也差不多忘了,呵呵10.用 socket 通訊寫出客戶端和服務(wù)器端的通訊,要求客戶發(fā)送數(shù)據(jù)后能夠
23、回顯相同的數(shù)據(jù)。答案:服務(wù)器端: socker() 建立套接字,綁定( bind )并監(jiān)聽( listen),用accept ()等待客戶端連接??蛻舳耍?socker() 建立套接字,連接( connect )服務(wù)器,連接上后使用send()和 recv(),在套接字上寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。服務(wù)器端: accept ()發(fā)現(xiàn)有客戶端連接,建立一個新的套接字,自身重新開始等待連接。該新產(chǎn)生的套接字使用send() 和 recv ()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢, closesocket()關(guān)閉套接字。15.同步和異步有和異同,在什么情況下分別使用他們?
24、舉例說明。如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。當(dāng)應(yīng)用程序在對象上調(diào)用了一個需要花費很長時間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時,就應(yīng)該使用異步編程 ,在很多情況下采用異步途徑往往更有效率。數(shù)據(jù)庫方面:1.存儲過程和函數(shù)的區(qū)別儲過程是用戶定義的一系列sql 語句的集合,涉及特定表或其它對象的任務(wù),用戶可以調(diào)用存儲過程, 而函數(shù)通常是數(shù)據(jù)庫已定義的方法,它接收參數(shù)并返回某種類型的值并且不涉及特定用戶表。2.事務(wù)是什么?事務(wù)是作為一個邏輯單元執(zhí)行的一系列操作,一個邏輯工作單
25、元必須有四個屬性,稱為 acid(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成為一個事務(wù):原子性一致性隔離性持久性解析 c 語言中的 sizeof 一、sizeof的概念sizeof 是 c 語言的一種單目操作符,如c 語言的其他操作符 +、-等。它并不是函數(shù)。sizeof 操作符以字節(jié)形式給出了其操作數(shù)的存儲大小。操作數(shù)可以是一個表達(dá)式或括在括號內(nèi)的類型名。操作數(shù)的存儲大小由操作數(shù)的類型決定。二、sizeof的使用方法1、用于數(shù)據(jù)類型sizeof 使用形式: sizeof(type)數(shù)據(jù)類型必須用括號括住。如sizeof(int) 。2、用于變量 sizeof 使用形式: sizeo
26、f(var_name )或 sizeofvar_name變量名可以不用括號括住。如sizeof(var_name),sizeofvar_name等都是正確形式。帶括號的用法更普遍,大多數(shù)程序員采用這種形式。注意:sizeof 操作符不能用于函數(shù)類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數(shù)據(jù)類型, 如未知存儲大小的數(shù)組類型、 未知內(nèi)容的結(jié)構(gòu)或聯(lián)合類型、 void 類型等。如 sizeof(max)若此時變量 max 定義為 intmax(),sizeof(char_v)若此時 char_v定義為 charchar_vmax 且 max 未知, sizeof(void)都不是正確形式
27、。三、sizeof的結(jié)果sizeof 操作符的結(jié)果類型是size_t,它在頭文件中 typedef 為 unsignedint 類型。該類型保證能容納實現(xiàn)所建立的最大對象的字節(jié)大小。1、若操作數(shù)具有類型char、unsignedchar或 signedchar,其結(jié)果等于 1。ansic 正式規(guī)定字符類型為1 字節(jié)。2、int、unsignedint、shortint、unsignedshort、longint、unsignedlong、float、double、longdouble 類型的 sizeof在 ansic 中沒有具體規(guī)定,大小依賴于實現(xiàn),一般可能分別為2、2、2、2、4、4、4、
28、8、10。五、sizeof的主要用途1、sizeof 操作符的一個主要用途是與存儲分配和i/o 系統(tǒng)那樣的例程進(jìn)行通信。例如:void*malloc(size_tsize),size_tfread(void*ptr,size_tsize,size_tnmemb,file*stream) 。2、sizeof 的另一個的主要用途是計算數(shù)組中元素的個數(shù)。例如:void*memset (void*s,intc,sizeof(s)) 。六、建議由于操作數(shù)的字節(jié)數(shù)在實現(xiàn)時可能出現(xiàn)變化,建議在涉及到操作數(shù)字節(jié)大小時用sizeof 來代替常量計算。本文主要包括二個部分,第一部分重點介紹在vc 中,怎么樣采用
29、sizeof 來求結(jié)構(gòu)的大小,以及容易出現(xiàn)的問題,并給出解決問題的方法,第二部分總結(jié)出vc中 sizeof 的主要用法。1、 sizeof應(yīng)用在結(jié)構(gòu)上的情況請看下面的結(jié)構(gòu):struct mystruct double dda1; char dda; int type ; 對結(jié)構(gòu) mystruct 采用 sizeof會出現(xiàn)什么結(jié)果呢? sizeof(mystruct)為多少呢?也許你會這樣求:sizeof(mystruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 但是當(dāng)在 vc 中測試上面結(jié)構(gòu)的大小時,你會發(fā)現(xiàn)sizeof(mystruct)為 1
30、6。你知道為什么在 vc 中會得出這樣一個結(jié)果嗎?其實,這是 vc 對變量存儲的一個特殊處理。為了提高cpu的存儲速度, vc 對一些變量的起始地址做了“對齊”處理。在默認(rèn)情況下,vc 規(guī)定各成員變量存放的起始地址相對于結(jié)構(gòu)的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。下面列出常用類型的對齊方式(vc6.0,32位系統(tǒng) )。類型 對齊方式(變量存放的起始地址相對于結(jié)構(gòu)的起始地址的偏移量)char偏移量必須為 sizeof(char)即 1 的倍數(shù)int 偏移量必須為 sizeof(int)即 4 的倍數(shù)float 偏移量必須為 sizeof(float)即 4 的倍數(shù)double偏
31、移量必須為 sizeof(double)即 8 的倍數(shù)short 偏移量必須為 sizeof(short)即 2 的倍數(shù)各成員變量在存放的時候根據(jù)在結(jié)構(gòu)中出現(xiàn)的順序依次申請空間,同時按照上面的對齊方式調(diào)整位置,空缺的字節(jié)vc 會自動填充。同時 vc 為了確保結(jié)構(gòu)的大小為結(jié)構(gòu)的字節(jié)邊界數(shù) (即該結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù))的倍數(shù), 所以在為最后一個成員變量申請空間后,還會根據(jù)需要自動填充空缺的字節(jié)。下面用前面的例子來說明vc 到底怎么樣來存放結(jié)構(gòu)的。struct mystruct double dda1; char dda; int type ;為上面的結(jié)構(gòu)分配空間的時候,vc 根據(jù)
32、成員變量出現(xiàn)的順序和對齊方式,先為第一個成員 dda1 分配空間,其起始地址跟結(jié)構(gòu)的起始地址相同(剛好偏移量0剛好為 sizeof(double)的倍數(shù)) ,該成員變量占用 sizeof(double)=8 個字節(jié);接下來為第二個成員 dda分配空間,這時下一個可以分配的地址對于結(jié)構(gòu)的起始地址的偏移量為 8,是 sizeof(char)的倍數(shù),所以把 dda存放在偏移量為 8 的地方滿足對齊方式,該成員變量占用sizeof(char)=1個字節(jié);接下來為第三個成員type 分配空間,這時下一個可以分配的地址對于結(jié)構(gòu)的起始地址的偏移量為9,不是sizeof(int)=4 的倍數(shù),為了滿足對齊方式
33、對偏移量的約束問題,vc 自動填充3個字節(jié)(這三個字節(jié)沒有放什么東西) ,這時下一個可以分配的地址對于結(jié)構(gòu)的起始地址的偏移量為12,剛好是 sizeof(int)=4 的倍數(shù),所以把type 存放在偏移量為 12 的地方,該成員變量占用sizeof(int)=4 個字節(jié);這時整個結(jié)構(gòu)的成員變量已經(jīng)都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結(jié)構(gòu)的字節(jié)邊界數(shù)(即結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù)sizeof(double)=8) 的倍數(shù) , 所 以 沒 有 空 缺 的 字 節(jié) 需 要 填 充 。 所 以 整 個 結(jié) 構(gòu) 的 大 小 為 :sizeof(mystruct)=
34、8+1+3+4=16,其中有 3 個字節(jié)是 vc 自動填充的,沒有放任何有意義的東西。下面再舉個例子,交換一下上面的mystruct 的成員變量的位置,使它變成下面的情況:struct mystruct char dda; double dda1; int type ;這個結(jié)構(gòu)占用的空間為多大呢?在vc6.0 環(huán)境下,可以得到sizeof(mystruc)為24。結(jié)合上面提到的分配空間的一些原則,分析下 vc 怎么樣為上面的結(jié)構(gòu)分配空間的。 (簡單說明)struct mystruct char dda;/偏移量為 0,滿足對齊方式, dda占用 1 個字節(jié);double dda1;/下一個可用
35、的地址的偏移量為1,不是 sizeof(double)=8 /的倍數(shù),需要補足 7 個字節(jié)才能使偏移量變?yōu)?(滿足對齊方式),因此 vc 自動填充 7個字節(jié), dda1存放在偏移量為的地址上,它占用8 個字節(jié)。int type;/下一個可用的地址的偏移量為16,是 sizeof(int)=4 的倍 /數(shù),滿足 int的對齊方式,所以不需要vc 自動填充, type 存放在偏移量為 16 的地址上,它占用 4 個字節(jié)。;/所有成員變量都分配了空間,空間總的大小為1+7+8+4=20,不是結(jié)構(gòu)的節(jié)邊界數(shù) (即結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù)sizeof(double)=8) 的倍數(shù),所以需要
36、填充 4 個字節(jié),以滿足結(jié)構(gòu)的大小sizeof(double)=8的倍數(shù)。所以該結(jié)構(gòu)總的大小為:sizeof(mystruc)為 1+7+8+4+4=24。其中總的有7+4=11個字節(jié)是 vc 自動填充的,沒有放任何有意義的東西。2、 sizeof用法總結(jié)在 vc 中,sizeof 有著許多的用法,而且很容易引起一些錯誤。下面根據(jù)sizeof后面的參數(shù)對 sizeof 的用法做個總結(jié)。a參數(shù)為數(shù)據(jù)類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的。例如int 類型在 16 位系統(tǒng)中占 2 個字節(jié),在
37、32 位系統(tǒng)中占 4 個字節(jié)。b 參數(shù)為數(shù)組或指針。下面舉例說明. int a50; /sizeof(a)=4*50=200; 求數(shù)組所占的空間大小int *a=new int50;/ sizeof(a)=4; a為一個指針, sizeof(a)是求指針的大小,在 32 位系統(tǒng)中,當(dāng)然是占4 個字節(jié)。c 參數(shù)為結(jié)構(gòu)或類。 sizeof 應(yīng)用在類和結(jié)構(gòu)的處理情況是相同的。但有兩點需要注意,第一、結(jié)構(gòu)或者類中的靜態(tài)成員不對結(jié)構(gòu)或者類的大小產(chǎn)生影響,因為靜態(tài)變量的存儲位置與結(jié)構(gòu)或者類的實例地址無關(guān)。第二、沒有成員變量的結(jié)構(gòu)或類的大小為1,因為必須保證結(jié)構(gòu)或類的每一個實例在內(nèi)存中都有唯一的地址。下面舉
38、例說明,class testint a;static double c;/sizeof(test)=4. test *s;/sizeof(s)=4,s為一個指針。class test1 ;/sizeof(test1)=1; d 參數(shù)為其他。下面舉例說明。int func(char s5); coutsizeof(s);/ 這里將輸出 4,本來 s為一個數(shù)組,但由于做為函數(shù)的參數(shù)在傳遞的時候系統(tǒng)處理為一個指針,所以sizeof(s)實際上為求指針的大小。return 1; sizeof(func( “1234” )=4/因為 func 的返回類型為 int,所以相當(dāng)于/求 sizeof(int). 對齊方式是編譯器設(shè)置的, vc 下默認(rèn)是 8 字節(jié)對齊的。 -你的這句話欠妥,至少你可以在 vc6 下做實驗,絕大多數(shù)情況下,都是4 字節(jié)對齊的。確實是 8字節(jié)對齊 ,大多數(shù)的 32 位編譯器也都如此 .8字節(jié)對齊是指最大8 字節(jié)對齊,就是如果一個變量為16 字節(jié),也只在 8 字節(jié)邊界對齊 .具體的對齊邊界是min( pack , maxsizeof( data ) ).如果一個結(jié)構(gòu)中最大的成員只有4 字節(jié)就會以 4字節(jié)對齊 ,最大只有 2 字節(jié)就會在偶地址對齊 . 原題大意是這樣的:有 n 個大小不等的自然數(shù)( 1-n) ,請將它們由小到大排
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 節(jié)能oem合同范例
- 代銷售合同范例
- 明星代言簽約合同范例
- 兩兄弟宅基地合同范例
- 居間勞務(wù)派遣合同范例
- 銅仁幼兒師范高等??茖W(xué)?!稊?shù)字場景設(shè)計與表現(xiàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 銅川職業(yè)技術(shù)學(xué)院《數(shù)學(xué)教學(xué)技能與訓(xùn)練》2023-2024學(xué)年第一學(xué)期期末試卷
- 同濟(jì)大學(xué)《刑法學(xué)(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 人教版小學(xué)數(shù)學(xué)五年級下冊 3 3《長方體和正方體的體積》同步練習(xí)
- 鎮(zhèn)江2024年江蘇鎮(zhèn)江揚中市公安局招聘警務(wù)輔助人員47人歷年參考題庫(頻考版)含答案解析
- 2024-2030年中國充血性心力衰竭(CHF)治療設(shè)備行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 五年級道德與法治上冊說課稿《古代科技 耀我中華(第一課時) 》部編版
- 小學(xué)語文大單元設(shè)計論文
- Unit 6 教學(xué)教學(xué)設(shè)計 2024-2025學(xué)年人教版七年級英語上冊
- Visio商業(yè)圖表制作分析智慧樹知到期末考試答案章節(jié)答案2024年上海商學(xué)院
- 競爭性談判工作人員簽到表及競爭性談判方案
- YYT 0681.5-2010 無菌醫(yī)療器械包裝試驗方法 第5部分 內(nèi)壓法檢測粗大泄漏(氣泡法)
- 三方協(xié)議書電子版
- 山東省淄博市張店區(qū)2023-2024學(xué)年九年級上學(xué)期1月期末化學(xué)試題(含解析)
- 廈門旅游課件
- 人工智能導(dǎo)論智慧樹知到期末考試答案章節(jié)答案2024年哈爾濱工程大學(xué)
評論
0/150
提交評論