剛剛親身體驗(yàn)的2017企業(yè)筆試題集第一篇,本人感覺,有新手級別的問題、也有較為復(fù)雜的問題,這里先將筆試問題和部分答案總結(jié)放出,感興趣的朋友可以mark一下,有新答案時本文章將更新~~
2017騰訊模擬筆試--移動端開發(fā)
-
()是一個獨(dú)立可交付的功能單元,外界通過接口訪問其提供的服務(wù)?
答:基于構(gòu)件開發(fā)中的構(gòu)件(Component)
個人理解:相比于以上的構(gòu)件,- 面向?qū)ο笙到y(tǒng)中的對象(Object):重點(diǎn)是“面向?qū)ο笙到y(tǒng)”,強(qiáng)調(diào)對象屬性和功能,對于'獨(dú)立可交付'的概念,這里并沒有看出對象有此能力。
- 模塊化程序設(shè)計中的子程序(Subroutine):“模塊化”,我們都知道,一個項(xiàng)目有多個業(yè)務(wù),每個業(yè)務(wù)有不少功能模塊,而單個模塊子程序不太可能“獨(dú)立交互”吧,當(dāng)然得整個項(xiàng)目雛形出來了,才可談交付。
- 系統(tǒng)模型中的包(Package):“包”強(qiáng)調(diào)按“功能”或“屬性和類型”對基本組件進(jìn)行劃分,和“獨(dú)立可交互”并沒有太大關(guān)系。
-
設(shè)計模式和對應(yīng)例子
答:Android相關(guān)的26種設(shè)計模式 -
動態(tài)庫和靜態(tài)庫的優(yōu)劣
解析: - 使用動態(tài)庫,可以將最終可執(zhí)行文件體積縮小
- 使用動態(tài)庫,多個應(yīng)用程序共享內(nèi)存中得同一份庫文件,節(jié)省資源
- 使用動態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下,更新動態(tài)庫文件達(dá)到更新應(yīng)用程序的目的。
庫從本質(zhì)上來說是一種可執(zhí)行代碼的二進(jìn)制格式,可以被載入內(nèi)存中執(zhí)行。庫分靜態(tài)庫和動態(tài)庫兩種。
- 靜態(tài)函數(shù)庫
這類庫,Linux中的名字一般是libxxx.a,Window中是xxx.lib;利用靜態(tài)函數(shù)庫編譯成的文件比較大,因?yàn)檎麄€ 函數(shù)庫的所有數(shù)據(jù)都會被整合進(jìn)目標(biāo)代碼中,他的優(yōu)點(diǎn)就顯而易見了,即編譯后的執(zhí)行程序不需要外部的函數(shù)庫支持,因?yàn)樗惺褂玫暮瘮?shù)都已經(jīng)被編譯進(jìn)去了。當(dāng)然這也會成為他的缺點(diǎn),因?yàn)槿绻o態(tài)函數(shù)庫改變了,那么你的程序必須重新編譯。 - 動態(tài)函數(shù)庫
這類庫,Linux中的名字一般是libxxx.so,Window中是xxx.dll;相對于靜態(tài)函數(shù)庫,動態(tài)函數(shù)庫在編譯的時候 并沒有被編譯進(jìn)目標(biāo)代碼中,你的程序執(zhí)行到相關(guān)函數(shù)時才調(diào)用該函數(shù)庫里的相應(yīng)函數(shù),因此動態(tài)函數(shù)庫所產(chǎn)生的可執(zhí)行文件比較小。由于函數(shù)庫沒有被整合進(jìn)你的程序,而是程序運(yùn)行時動態(tài)的申請并調(diào)用,所以程序的運(yùn)行環(huán)境中必須提供相應(yīng)的庫。動態(tài)函數(shù)庫的改變并不影響你的程序,所以動態(tài)函數(shù)庫的升級比較方便。
詳細(xì)可看:
C/C++的const、virtual關(guān)鍵字,& 和 指針相關(guān)
簡單分析:coust關(guān)鍵字:可以看成Java的final關(guān)鍵字,被修飾的對象,只能在初始化時被賦值一次,被當(dāng)成是常量。
virtual關(guān)鍵字:可以比作Java的abstract關(guān)鍵字,用于修飾方法的話,父類的該方法可以由子類來重寫。
&和指針,不多說。
Http 響應(yīng)狀態(tài)碼
可以參考百度百科,查看細(xì)節(jié)(HTTP狀態(tài)碼)100-199 用于指定客戶端應(yīng)相應(yīng)的某些動作。1XX表示:消息
200-299 用于表示請求成功。2XX表示:成功
300-399 用于已經(jīng)移動的文件并且常被包含在定位頭信息中指定新的地址信息。3XX表示:重定向
400-499 用于指出客戶端錯誤。4XX表示:客戶端錯誤
-
500-599 用于支持服務(wù)器錯誤。5XX表示:服務(wù)端錯誤
棧溢出攻擊
解析:詳細(xì)可以參考這篇簡書,可以理解為:利用內(nèi)存中存儲的數(shù)組等連續(xù)且有限的存儲地址上,存儲大于這個連續(xù)長度的數(shù)據(jù),導(dǎo)致內(nèi)存的這一連續(xù)存儲區(qū)域不夠裝載數(shù)據(jù),從而把溢出的數(shù)據(jù)存儲到相鄰的存儲單元中,導(dǎo)致相鄰的數(shù)據(jù)改變,的這種攻擊。判斷:NDK更容易獲取更多的Android系統(tǒng)層的API?
答:這里,是錯誤的。因?yàn)镹DK只是一套工具的集合,在新的SDK中被集成,目的只是輔助Android JNI更好、更快捷地開發(fā)native方法等,可以吧NDK看做是Android JNI相關(guān)語法操作的部分封裝,它最終還是會調(diào)用Android JNI相關(guān)操作,Android系統(tǒng)層的API賦予訪問的權(quán)限沒變。針對手Q/微信,哪三個性能指標(biāo)對手機(jī)的耗電影響大?
矩陣乘法
完全二叉樹的結(jié)點(diǎn)問題
解析:這里提一提幾個公式,詳情可以看看我的文章《程序員面試闖關(guān)(二):數(shù)據(jù)結(jié)構(gòu)考點(diǎn)與細(xì)節(jié)分析》
- 在二叉樹的第i層上至多有2^(i-1)個結(jié)點(diǎn)
- 深度為k的二叉樹至多有2^k -1個結(jié)點(diǎn)
- 任意一顆二叉樹,n2(度數(shù)為2的結(jié)點(diǎn)) = n0(度數(shù)為0的結(jié)點(diǎn))-1
- 樹的邊數(shù)(也叫:分支線總數(shù))和結(jié)點(diǎn)數(shù)的關(guān)系:邊數(shù) = n-1 = n1+2*n2(其中n1表示度為1的結(jié)點(diǎn),n2表示度為2的結(jié)點(diǎn))
- IOS下,開啟ARC內(nèi)存管理的代碼
-
操作系統(tǒng):用戶態(tài)和內(nèi)核態(tài)
解析:
用戶態(tài)和內(nèi)核態(tài)(詳細(xì)可以參考下這篇文章)- 定義:我們所面對的基本所有應(yīng)用程序都是用戶進(jìn)程、處于用戶態(tài),而內(nèi)核態(tài)是相對于內(nèi)核態(tài)而言的,用戶態(tài)的程序?qū)τ跀?shù)據(jù)訪問區(qū)域等都會被限制,無法訪問一些系統(tǒng)重要數(shù)據(jù)和系統(tǒng)操作,而需要擁有訪問這些‘特權(quán)級別數(shù)據(jù)’的能力的進(jìn)程才能訪問和處理,比如系統(tǒng)進(jìn)程。那么就有了內(nèi)核態(tài),系統(tǒng)進(jìn)程就處于內(nèi)核態(tài)??偟膩碚f:
內(nèi)核態(tài): CPU可以訪問內(nèi)存所有數(shù)據(jù), 包括外圍設(shè)備, 例如硬盤, 網(wǎng)卡. CPU也可以將自己從一個程序切換到另一個程序。
**用戶態(tài): **只能受限的訪問內(nèi)存, 且不允許訪問外圍設(shè)備. 占用CPU的能力被剝奪, CPU資源可以被其他程序獲取。 - 用戶態(tài)切換到內(nèi)核態(tài)的方式:
系統(tǒng)調(diào)用:用戶進(jìn)程有需要用到如讀取系統(tǒng)鍵盤輸入或者從硬盤讀取數(shù)據(jù)等只有系統(tǒng)進(jìn)程有權(quán)利做得事情,那么,就需要以程序本身的名義去請求系統(tǒng),讓系統(tǒng)根據(jù)程序的意愿去訪問這些操作,用戶態(tài)程序切換到內(nèi)核態(tài), 但是不能控制在內(nèi)核態(tài)中執(zhí)行的指令,這就是系統(tǒng)調(diào)用。
總體的過程是:用戶態(tài)程序?qū)⒁恍?shù)據(jù)值放在寄存器中, 或者使用參數(shù)創(chuàng)建一個堆棧(stack frame), 以此表明需要操作系統(tǒng)提供的服務(wù).
用戶態(tài)程序執(zhí)行陷阱指令(陷阱指令是CPU實(shí)現(xiàn)系統(tǒng)調(diào)用的具體方式)
CPU切換到內(nèi)核態(tài), 并跳到位于內(nèi)存指定位置的指令, 這些指令是操作系統(tǒng)的一部分, 他們具有內(nèi)存保護(hù), 不可被用戶態(tài)程序訪問
這些指令稱之為陷阱(trap)或者系統(tǒng)調(diào)用處理器(system call handler). 他們會讀取程序放入內(nèi)存的數(shù)據(jù)參數(shù), 并執(zhí)行程序請求的服務(wù)系統(tǒng)調(diào)用完成后, 操作系統(tǒng)會重置CPU為用戶態(tài)并返回系統(tǒng)調(diào)用的結(jié)果
異常:當(dāng)CPU在執(zhí)行運(yùn)行在用戶態(tài)下的程序時,發(fā)生了某些事先不可知的異常,這時會觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁異常。
外圍設(shè)備的中斷:當(dāng)外圍設(shè)備完成用戶請求的操作后,會向CPU發(fā)出相應(yīng)的中斷信號,這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應(yīng)的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤讀寫操作完成,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等。
- 定義:我們所面對的基本所有應(yīng)用程序都是用戶進(jìn)程、處于用戶態(tài),而內(nèi)核態(tài)是相對于內(nèi)核態(tài)而言的,用戶態(tài)的程序?qū)τ跀?shù)據(jù)訪問區(qū)域等都會被限制,無法訪問一些系統(tǒng)重要數(shù)據(jù)和系統(tǒng)操作,而需要擁有訪問這些‘特權(quán)級別數(shù)據(jù)’的能力的進(jìn)程才能訪問和處理,比如系統(tǒng)進(jìn)程。那么就有了內(nèi)核態(tài),系統(tǒng)進(jìn)程就處于內(nèi)核態(tài)??偟膩碚f:
-
死鎖和銀行家算法
解析: - 死鎖:所謂死鎖,是指兩個以上的進(jìn)程互相都要求對方已經(jīng)占有的資源導(dǎo)致無法繼續(xù)運(yùn)行下去的現(xiàn)象。
-
死鎖產(chǎn)生的必要條件:
(1)互斥:即一個資源每次只能被一個進(jìn)程使用,在操作系統(tǒng)中這是真實(shí)存在的情況。
(2)占有且等待:有一個進(jìn)程已獲得了一些資源,但因請求其他資源被阻塞時,對已獲得的資源保持不放。
(3)占有資源不可剝奪:有些系統(tǒng)資源是不可剝奪的,當(dāng)某個進(jìn)程已獲得這種資源后,系統(tǒng)不能強(qiáng)行收回,只能由進(jìn)程使用完時自己釋放。
(4)環(huán)路等待:若干個進(jìn)程形成環(huán)形鏈,每個都占用對方要申請的下一個資源。 -
死鎖預(yù)防:死鎖預(yù)防是采用某種策略,限制并發(fā)進(jìn)程對資源的請求,破壞死鎖產(chǎn)生的4個必要條件之一,使系統(tǒng)在任何時刻都不滿足死鎖的必要條件。
(1)預(yù)先靜態(tài)分配法。破壞了“不可剝奪條件”。預(yù)先分配所需資源,保證不等待資源。該方法的問題是降低了對資源的請求,降低進(jìn)程的并發(fā)程度;有時可能無法預(yù)先知道所需資源。
(2)資源有序分配法。破壞了“環(huán)路條件”。把資源分類按順序。保證不形成環(huán)路。該方法存在的問題是限制進(jìn)程對資源的請求;由于資源的排序占用系統(tǒng)開銷。 - 死鎖避免:避免是指進(jìn)程在每次申請資源時判斷這些操作是否安全,典型算法是“銀行家算法”。但這種算法會增加系統(tǒng)的開銷。
- 死鎖檢測:判斷系統(tǒng)是否處于死鎖狀態(tài),如果是,則執(zhí)行死鎖解除策略。
- 死鎖解除:與死鎖檢測結(jié)合使用,它使用的方式就是剝奪。即將資源強(qiáng)行分配給別的進(jìn)程。
- 關(guān)于銀行家算法,可以參考這里。
- 問答題:王者榮耀游戲中,如下兩個問題該如何考慮:實(shí)時PVP同步問題 和 技術(shù)選型
京東(練習(xí)題)
Redhat 9 支持的安裝方式:
A.Telnet網(wǎng)絡(luò)安裝
B.HTTP網(wǎng)絡(luò)安裝
C.本地硬盤驅(qū)動器進(jìn)行安裝
D.通過NFS進(jìn)行網(wǎng)絡(luò)安裝
答案:BCDPHP相關(guān)
<bean:define xxxx><bean:write>- 等等
- Linux基本命令
- C/C++基礎(chǔ)編程問題,如下
int main()
{
int n[][3] = {1,2,3,4,5,6};
int (*p)[3];
p = n;
printf("%d %d %d\n", p[0][0], *(p[0]+1), (*p)[2]);
return 0;
}
輸出為:1,2,3
-
編程題:水仙花數(shù)
解析:
水仙花數(shù)是指一個 n 位數(shù) ( n≥3 ),它的每個位上的數(shù)字的 n 次冪之和等于它本身。較簡單,示例解法如下:
///獲取100到999之間的水仙花數(shù)的總數(shù)
public class ShuiXianHuaShu {
public static void main(String[] args) {
int x = 0; //定義水仙花數(shù)的個數(shù)
for(int i=100;i<=999;i++){
int b = i/100; //取得百位數(shù)
int s = i%100/10; //取得十位數(shù)
int g = i%10; //取得個位數(shù)
if(i==Math.pow(b, 3) + Math.pow(s, 3) + Math.pow(g, 3)){
x++; //每次符合水仙花數(shù)條件,則x+1;
System.out.print(i+" "); //輸出符合條件的數(shù)
}
}
System.out.println(); //換行
System.out.println("水仙花數(shù)總共有"+x+"個"); //輸出水仙花數(shù)的總數(shù)
}
}
```
-
Java 求N次方、開N次方根、求絕對值相關(guān)函數(shù):
答:Math.pow(N) , Math.sqrt(N), Math.abs(N)
京東2017筆試
- 排序的分類(基于比較的排序?)
- 計數(shù)排序
- 正則表達(dá)式:問:只能輸入0 或者 非零開頭的數(shù)字
- 獲取手機(jī)屏幕的方法:getMetrics() ?
-
計網(wǎng):屬于DHCP客戶端的消息有?
offer,request,ack ,還有嗎? - 軟件工程:數(shù)據(jù)流圖 加工
- MySQL的Hash索引
- 補(bǔ)碼 加減法
- 關(guān)于 RISC的特征
-
二叉排序樹 與 二分查找
解釋:具體題目考的是二叉排序樹下給定元素,并進(jìn)行查找該元素的所用步數(shù)最多最少問題,可以看成二分查找問題。 - 什么是 活前綴
- 線性窺孔優(yōu)化的特點(diǎn)
<input>的type屬性- SNMP (簡單網(wǎng)絡(luò)管理協(xié)議)
- 計算機(jī)網(wǎng)絡(luò)安全的目標(biāo)?
- apache目錄訪問控制的參數(shù)有哪些?
- 點(diǎn)9圖片的特點(diǎn)和用法
- gc的基本原理和主動請求gc的方法
- activity退出的方法?如何退出多個Activity?
2017阿里筆試
-
OS:雙核CPU性能要提升1/4,那么,每一條指令的執(zhí)行速率需要提升多少?
答:個人感覺這里考察CPU性能指標(biāo)??梢詤⒖?a target="_blank" rel="nofollow">CPU性能指標(biāo)
這道題沒有說系統(tǒng)是否支持CPU并發(fā)處理的能力,如果支持、并且指令平分在幾個可并發(fā)執(zhí)行的程序中,那么,一條指令執(zhí)行速率只需要提升1/8,否則,需要提升1/4。 - 幾何:相同周長的圓內(nèi)四邊形和三角形,哪個面積更大?(類似問題)
-
概率論:概率問題
答:這里主要是計算公式的記憶。 - OOM的情形和解決方案
- Android客戶端,用Java實(shí)現(xiàn)一個線程池(可用Java數(shù)據(jù)結(jié)構(gòu)),需滿足:(需要看看線程池的實(shí)現(xiàn)原理)
- 可往前/往后插入task
- 可配置最大同時執(zhí)行線程數(shù)
- 對線程池中當(dāng)前同一個類型的連續(xù)task進(jìn)行合并執(zhí)行。
- 編程題:輸入一個只有大小寫字母和數(shù)字的字符串,最終,輸入所有數(shù)字中出現(xiàn)次數(shù)最多的那個數(shù)字的總和。如:輸入
ab11c2d3ff11ee,則輸出22
2017騰訊筆試
一、選擇題
- IOS常用的多線程編程組件:GCD?NSOperationQueue?NSThread?
-
C/C++ “virtual”
答:被修飾的對象可被子類重寫,類似于Java的abstract關(guān)鍵字。 -
大字節(jié)序和小字節(jié)序相關(guān)問題
解析:
端模式分為:小端字節(jié)序和大端字節(jié)序,也就是字節(jié)在內(nèi)存中的順序?!緝?nèi)存低地址指的是:地址下標(biāo)較小的地址】
- 小端字節(jié)序:低字節(jié)存于內(nèi)存低地址;高字節(jié)存于內(nèi)存高地址。
-
大端字節(jié)序:高字節(jié)存于內(nèi)存低地址;低字節(jié)存于內(nèi)存高地址。
例子如下:
內(nèi)存地址 大端字節(jié)序 小端字節(jié)序
0x0000ff08 0x12 0x78
0x0000ff09 0x34 0x56
0x0000ff0a 0x56 0x34
0x0000ff0b 0x78 0x12
- 關(guān)于死鎖:
- 有序分配資源可以預(yù)防死鎖?
- 銀行家算法可以檢測死鎖?
- 剝奪所有資源,可以解除死鎖?
-
TCP能力:
- 端到端流量控制?
- 數(shù)據(jù)按需到達(dá)?
- Linux進(jìn)程間通信
- 廣播屬于Android跨進(jìn)程通信
- QQ、FTP、HTTP、DNS,哪些只用了TCP,沒有用UDP?
- C/C++,關(guān)于:
-
~A()是什么意思? -
delete和delete[]是什么?
- C語言的
sizeof()問題:
int a = 1024;
char[] ch = "abc";
const char* p = ch;
///然后,求sizeof(a) , sizeof(ch), sizeof(p)
答: 代碼的結(jié)果是:4 4 4
解析:a是int類型,4byte;ch是字符數(shù)組,使用sizeof(ch)會算上字符數(shù)組末尾隱含的\0結(jié)束符,所以,一共有3+1個char,4byte;p是指針,指向字符數(shù)組,p指向的是數(shù)組,數(shù)組是引用類型,所以其實(shí)ch和p的作用一樣,所以ch的大小就是p的大小。
-
Android九宮格解鎖(4<=點(diǎn)數(shù)<=9)有多少種路徑? 389112種?
答: 389112種,詳細(xì)解法可看這里 - 數(shù)據(jù)庫:唯一約束和主鍵的關(guān)系
- 數(shù)據(jù)庫:復(fù)合索引
- ARP協(xié)議
- 數(shù)據(jù)庫:
count()語句用法 -
*p=Struct XXX{},那么,p的地址,是結(jié)構(gòu)體的哪個位置?*
答:指向結(jié)構(gòu)體的第一個元素的首地址
如下例子:#include <stdio.h> #include <stdlib.h>
typedef struct {
int a;
int b;
char c;
}Node , *NodePtr;
int main()
{
Node node;
node.a = 2;
node.b = 3;
node.c = 'C';
NodePtr q = &node;
printf("%d %d %d %d",q,&(q->a), &(q->b), node.b);///q 和 &(q->a)的值一樣,是node.a的地址,&(q->b) = &(q->a)+4
return 0;
}
```
-
數(shù)據(jù)庫范式相關(guān):關(guān)系模式R中,屬性全是主屬性,則R最高范式是?
答:第三范式
解析:- 這樣如R(X,Y,Z), F={Y--Z, XZ--Y}. XY和XZ都可以做為候選碼,即R中的屬性全為主屬性,且不存在非主屬性對碼的傳遞函數(shù)依賴,因此R屬于3NF.
BCNF的定義是:關(guān)系模式R<U,F屬于1NF.若Y函數(shù)依賴于X且Y不包含于X時X必含有碼,則R<U,F屬于BCNF.即若每一個決定因素都包含碼,則R屬于BCNF.
BCNF中有一條性質(zhì),是所有的主屬性對每一個不包含它的碼,是完全函數(shù)依賴.這樣當(dāng)選擇XY做為主碼時,Z就對XY部分函數(shù)依賴了(因?yàn)閆函數(shù)依賴于Y,也就是Z函數(shù)依賴于主碼XY的一部分,而不是XY整體),因此R不屬于BCNF。
- 這樣如R(X,Y,Z), F={Y--Z, XZ--Y}. XY和XZ都可以做為候選碼,即R中的屬性全為主屬性,且不存在非主屬性對碼的傳遞函數(shù)依賴,因此R屬于3NF.
擴(kuò)展:關(guān)于范式
* 第一范式【如果關(guān)系R中所有屬性的值域都是單純域,那么關(guān)系模式R是第一范式?!?br>
* 有主鍵
* 主鍵不為空
* 主鍵不能重復(fù)
* 字段不可再分
* 第二范式【如果關(guān)系模式R是第一范式的,而且關(guān)系中每一個非主屬性不部分依賴于主鍵,稱R是第二范式的?!?br>
* 是1NF
* 非主屬性完全依賴于碼。
* 第三范式【符合2NF,并且,消除傳遞依賴,即要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息】
* 是2NF
* 不存在依賴傳遞,比如:表一中有A和B兩屬性,表二有B和C兩屬性,那么如果滿足A ->B ,B ->C,那么,就不滿足3NF,因?yàn)橐蕾囮P(guān)系被傳遞了。
-
C++上的空類,在32位機(jī)器上,sizeof占多大?
答案:1
解析:- 實(shí)例化的原因(空類同樣可以被實(shí)例化),每個實(shí)例在內(nèi)存中都有一個獨(dú)一無二的地址,為了達(dá)到這個目的,編譯器往往會給一個空類隱含的加一個字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無二的地址,所以空類所占的內(nèi)存大小是1個字節(jié)。
- 擴(kuò)展:C和C++編譯器有所不同:
表示:C++編譯器默認(rèn)分配一個字節(jié)(如果內(nèi)部沒有成員,有,則以成員總空間為主),以便標(biāo)記可能初始化的類的實(shí)例,同時使空類占用的空間也最少(即1字節(jié))。而C編譯器,則給空struct分配0字節(jié)的空間。struct node{ }; class A{ }; class B : public A{ private: int b; }; class C : public A{ }; class D : public B{ }; class ClassE { public: int GetReturnValue() { return 0; } }; int main(){ cout << "A " << sizeof(A) << endl; //C++: 1 cout << "B " << sizeof(B) << endl; //C++: 4 cout << "C " << sizeof(C) << endl; //C++: 1 cout << "D " << sizeof(D) << endl; //C++: 4 cout << "E " << sizeof(ClassE) << endl; //C++: 1 cout << "node " << sizeof(node) << endl; //C++: 1 C:0 }為什么C++要至少分一個字節(jié)給類和結(jié)構(gòu)體呢?C++標(biāo)準(zhǔn)中規(guī)定,“no object shall have the same address in memory as any other variable” ,就是任何不同的對象不能擁有相同的內(nèi)存地址。 如果空類大小為0,若我們聲明一個這個類的對象數(shù)組,那么數(shù)組中的每個對象都擁有了相同的地址,這顯然是違背標(biāo)準(zhǔn)的。
公司局域網(wǎng)上ping www.qq.com 沒有涉及到的網(wǎng)絡(luò)協(xié)議:TCP ? DNS ? ICMP ? ARP ?
答案:全都涉及到。
解析:
- 首先, Ping的含義是:校驗(yàn)與遠(yuǎn)程計算機(jī)或本地計算機(jī)的連接。只有在安裝 TCP/IP 協(xié)議之后才能使用該命令。則ping操作涉及到TCP。
- 注意ping 的是一個http網(wǎng)址,它最終需要經(jīng)過DNS轉(zhuǎn)換為IP地址,也就是最終ping校驗(yàn)的是相應(yīng)的IP地址,所以,這個過程也涉及到DNS。
- Ping 命令通過向計算機(jī)發(fā)送 ICMP 回應(yīng)報文并且監(jiān)聽回應(yīng)報文的返回,以校驗(yàn)與遠(yuǎn)程計算機(jī)或本地計算機(jī)的連接,這個ping的過程實(shí)際上就是ICMP協(xié)議工作的過程。說明,而涉及到ICMP。
- ARP協(xié)議是“Address Resolution Protocol”(地址解析協(xié)議)的縮寫。它用于將IP地址轉(zhuǎn)換為mac地址【計算機(jī)物理地址】。如果主機(jī)A要Ping主機(jī)B,那么主機(jī)A就要封裝二層報文,他會先檢查自己的MAC地址,如果沒有B的MAC地址,就會向外發(fā)送一個ARP廣播包。說明,ping過程也會涉及到ARP協(xié)議。
相關(guān)參考:
* ping的整個過程
* ARP和ping的區(qū)別
-
C語言:
#pragma.pack(2)代表什么?
解析:每個特定平臺上的編譯器都有自己的默認(rèn)“對齊函數(shù)”(也稱為對齊模數(shù))#grama.pack(n)其中n可表示你的“對齊系數(shù)”,可?。?(boolean、char的大?。?、2(short的大小)、4(int的大?。?(float,long的大?。?、16(double的大小)
規(guī)則: - 數(shù)據(jù)成員的對齊規(guī)則:結(jié)構(gòu)(struct)(或者聯(lián)合(union))的數(shù)據(jù)成員,第一個數(shù)成員放在offset為0的地方,以后的每個數(shù)據(jù)成員的對齊按照
#pragma.pack(n)中的“n”指定的數(shù)值和數(shù)據(jù)成員自身長度中,比較小的那個來進(jìn)行。 - 結(jié)構(gòu)/聯(lián)合的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后,結(jié)構(gòu)(聯(lián)合)本身而要進(jìn)行對齊,對齊將按照
#gragma.pack(n)指定的數(shù)值和結(jié)構(gòu)(聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個進(jìn)行。
例子:
#pragma pack(4)
struct test {
char m1;//1 -> 4
double m4; //16 ->16
int m3; // 4 ->4
}
#pragma pack()
struct test t;
printf(sizeof(t));///輸出是24
#pragma pack(8)
typedef struct {
char i;//1
char j;//1
}s1;
typedef struct {
short i;//2
s1 k;// 2+1的占用空間
char j;//1
}s2;
#pragma pack()
sizeof(s1) = 2;sizeof(s2) = 6;他們都不是按照8個字節(jié)對齊的。
二、問答題
- 設(shè)計一個“搶紅包”業(yè)務(wù),如現(xiàn)在我有200個鉆石,我把他們分成20份,讓10萬粉絲來搶,問:
- 如何設(shè)計鉆石分配算法?
- 紅包分?jǐn)?shù)有限,高并發(fā)下怎么解決 固定分?jǐn)?shù)和 限額問題?
- 如果高峰階段,搶紅包的并發(fā)請求數(shù)可能達(dá)到8000次/秒,怎樣的存儲系統(tǒng)可支持該方案?
- 編程題:a~y 25個字母,用索引表示字母序列,如:a = 1, aa = 2 , aaa = 3, aaaa = 4 ,aaab = 5 …… ,一共有 a 到 yyyy 這么多種字母串,問:設(shè)計一個函數(shù), 輸入一個字母串,如‘a(chǎn)bcd’ ,輸出這個字母串對應(yīng)的索引值?
