Android Offer沖擊之路:筆試題集(一)

剛剛親身體驗(yàn)的2017企業(yè)筆試題集第一篇,本人感覺,有新手級別的問題、也有較為復(fù)雜的問題,這里先將筆試問題和部分答案總結(jié)放出,感興趣的朋友可以mark一下,有新答案時本文章將更新~~

2017騰訊模擬筆試--移動端開發(fā)


  1. ()是一個獨(dú)立可交付的功能單元,外界通過接口訪問其提供的服務(wù)?
    答:基于構(gòu)件開發(fā)中的構(gòu)件(Component)
    個人理解:相比于以上的構(gòu)件,
    1. 面向?qū)ο笙到y(tǒng)中的對象(Object):重點(diǎn)是“面向?qū)ο笙到y(tǒng)”,強(qiáng)調(diào)對象屬性和功能,對于'獨(dú)立可交付'的概念,這里并沒有看出對象有此能力。
    2. 模塊化程序設(shè)計中的子程序(Subroutine):“模塊化”,我們都知道,一個項(xiàng)目有多個業(yè)務(wù),每個業(yè)務(wù)有不少功能模塊,而單個模塊子程序不太可能“獨(dú)立交互”吧,當(dāng)然得整個項(xiàng)目雛形出來了,才可談交付。
    3. 系統(tǒng)模型中的包(Package):“包”強(qiáng)調(diào)按“功能”或“屬性和類型”對基本組件進(jìn)行劃分,和“獨(dú)立可交互”并沒有太大關(guān)系。
  2. 設(shè)計模式和對應(yīng)例子
    答:Android相關(guān)的26種設(shè)計模式
  3. 動態(tài)庫和靜態(tài)庫的優(yōu)劣
    解析:
  4. 使用動態(tài)庫,可以將最終可執(zhí)行文件體積縮小
  5. 使用動態(tài)庫,多個應(yīng)用程序共享內(nèi)存中得同一份庫文件,節(jié)省資源
  6. 使用動態(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ì)可看:
    1. 動態(tài)庫與靜態(tài)庫優(yōu)缺點(diǎn)比較
    2. 關(guān)于靜態(tài)庫、動態(tài)庫的區(qū)別匯總
  1. C/C++的const、virtual關(guān)鍵字,& 和 指針相關(guān)
    簡單分析:

  2. coust關(guān)鍵字:可以看成Java的final關(guān)鍵字,被修飾的對象,只能在初始化時被賦值一次,被當(dāng)成是常量。

  3. virtual關(guān)鍵字:可以比作Java的abstract關(guān)鍵字,用于修飾方法的話,父類的該方法可以由子類來重寫。

  4. &和指針,不多說。

  5. Http 響應(yīng)狀態(tài)碼
    可以參考百度百科,查看細(xì)節(jié)(HTTP狀態(tài)碼

  6. 100-199 用于指定客戶端應(yīng)相應(yīng)的某些動作。1XX表示:消息

  7. 200-299 用于表示請求成功。2XX表示:成功

  8. 300-399 用于已經(jīng)移動的文件并且常被包含在定位頭信息中指定新的地址信息。3XX表示:重定向

  9. 400-499 用于指出客戶端錯誤。4XX表示:客戶端錯誤

  10. 500-599 用于支持服務(wù)器錯誤。5XX表示:服務(wù)端錯誤


  11. 棧溢出攻擊
    解析:詳細(xì)可以參考這篇簡書,可以理解為:利用內(nèi)存中存儲的數(shù)組等連續(xù)且有限的存儲地址上,存儲大于這個連續(xù)長度的數(shù)據(jù),導(dǎo)致內(nèi)存的這一連續(xù)存儲區(qū)域不夠裝載數(shù)據(jù),從而把溢出的數(shù)據(jù)存儲到相鄰的存儲單元中,導(dǎo)致相鄰的數(shù)據(jù)改變,的這種攻擊。

  12. 判斷: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)限沒變。

  13. 針對手Q/微信,哪三個性能指標(biāo)對手機(jī)的耗電影響大?

  14. 矩陣乘法

  15. 完全二叉樹的結(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))
  1. IOS下,開啟ARC內(nèi)存管理的代碼
  2. 操作系統(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)的方式:
      1. 系統(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)用。
        總體的過程是:

      2. 用戶態(tài)程序?qū)⒁恍?shù)據(jù)值放在寄存器中, 或者使用參數(shù)創(chuàng)建一個堆棧(stack frame), 以此表明需要操作系統(tǒng)提供的服務(wù).

      3. 用戶態(tài)程序執(zhí)行陷阱指令(陷阱指令是CPU實(shí)現(xiàn)系統(tǒng)調(diào)用的具體方式)

      4. 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ù)

      5. 系統(tǒng)調(diào)用完成后, 操作系統(tǒng)會重置CPU為用戶態(tài)并返回系統(tǒng)調(diào)用的結(jié)果

      6. 異常:當(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),比如缺頁異常。

      7. 外圍設(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ù)操作等。

  3. 死鎖和銀行家算法
    解析:
  4. 死鎖:所謂死鎖,是指兩個以上的進(jìn)程互相都要求對方已經(jīng)占有的資源導(dǎo)致無法繼續(xù)運(yùn)行下去的現(xiàn)象。
  5. 死鎖產(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)形鏈,每個都占用對方要申請的下一個資源。
  6. 死鎖預(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)開銷。
  7. 死鎖避免:避免是指進(jìn)程在每次申請資源時判斷這些操作是否安全,典型算法是“銀行家算法”。但這種算法會增加系統(tǒng)的開銷。
  8. 死鎖檢測:判斷系統(tǒng)是否處于死鎖狀態(tài),如果是,則執(zhí)行死鎖解除策略。
  9. 死鎖解除:與死鎖檢測結(jié)合使用,它使用的方式就是剝奪。即將資源強(qiáng)行分配給別的進(jìn)程。
  10. 關(guān)于銀行家算法,可以參考這里
  11. 問答題:王者榮耀游戲中,如下兩個問題該如何考慮:實(shí)時PVP同步問題 和 技術(shù)選型

京東(練習(xí)題)


  1. Redhat 9 支持的安裝方式:
    A.Telnet網(wǎng)絡(luò)安裝
    B.HTTP網(wǎng)絡(luò)安裝
    C.本地硬盤驅(qū)動器進(jìn)行安裝
    D.通過NFS進(jìn)行網(wǎng)絡(luò)安裝
    答案:BCD

  2. PHP相關(guān)

  • <bean:define xxxx>
  • <bean:write>
  • 等等
  1. Linux基本命令
  2. 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

  1. 編程題:水仙花數(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ù)
}
}
```

  1. Java 求N次方、開N次方根、求絕對值相關(guān)函數(shù):
    答:Math.pow(N) , Math.sqrt(N), Math.abs(N)

京東2017筆試


  1. 排序的分類(基于比較的排序?)
  2. 計數(shù)排序
  3. 正則表達(dá)式:問:只能輸入0 或者 非零開頭的數(shù)字
  4. 獲取手機(jī)屏幕的方法:getMetrics() ?
  5. 計網(wǎng):屬于DHCP客戶端的消息有?
    offer,request,ack ,還有嗎?
  6. 軟件工程:數(shù)據(jù)流圖 加工
  7. MySQL的Hash索引
  8. 補(bǔ)碼 加減法
  9. 關(guān)于 RISC的特征
  10. 二叉排序樹 與 二分查找
    解釋:具體題目考的是二叉排序樹下給定元素,并進(jìn)行查找該元素的所用步數(shù)最多最少問題,可以看成二分查找問題。
  11. 什么是 活前綴
  12. 線性窺孔優(yōu)化的特點(diǎn)
  13. <input>的type屬性
  14. SNMP (簡單網(wǎng)絡(luò)管理協(xié)議)
  15. 計算機(jī)網(wǎng)絡(luò)安全的目標(biāo)?
  16. apache目錄訪問控制的參數(shù)有哪些?
  17. 點(diǎn)9圖片的特點(diǎn)和用法
  18. gc的基本原理和主動請求gc的方法
  19. activity退出的方法?如何退出多個Activity?

2017阿里筆試


  1. 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。
  2. 幾何:相同周長的圓內(nèi)四邊形和三角形,哪個面積更大?(類似問題)
  3. 概率論:概率問題
    答:這里主要是計算公式的記憶。
  4. OOM的情形和解決方案
  5. Android客戶端,用Java實(shí)現(xiàn)一個線程池(可用Java數(shù)據(jù)結(jié)構(gòu)),需滿足:(需要看看線程池的實(shí)現(xiàn)原理)
  • 可往前/往后插入task
  • 可配置最大同時執(zhí)行線程數(shù)
  • 對線程池中當(dāng)前同一個類型的連續(xù)task進(jìn)行合并執(zhí)行。
  1. 編程題:輸入一個只有大小寫字母和數(shù)字的字符串,最終,輸入所有數(shù)字中出現(xiàn)次數(shù)最多的那個數(shù)字的總和。如:輸入ab11c2d3ff11ee,則輸出22

2017騰訊筆試


一、選擇題

  1. IOS常用的多線程編程組件:GCD?NSOperationQueue?NSThread?
  2. C/C++ “virtual”
    答:被修飾的對象可被子類重寫,類似于Java的abstract關(guān)鍵字。
  3. 大字節(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
  1. 關(guān)于死鎖:
  2. 有序分配資源可以預(yù)防死鎖?
  3. 銀行家算法可以檢測死鎖?
  4. 剝奪所有資源,可以解除死鎖?
  5. TCP能力:
    1. 端到端流量控制?
    2. 數(shù)據(jù)按需到達(dá)?
  6. Linux進(jìn)程間通信
  7. 廣播屬于Android跨進(jìn)程通信
  8. QQ、FTP、HTTP、DNS,哪些只用了TCP,沒有用UDP?
  9. C/C++,關(guān)于:
  • ~A()是什么意思?
  • deletedelete[]是什么?
  1. 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的大小。

  1. Android九宮格解鎖(4<=點(diǎn)數(shù)<=9)有多少種路徑? 389112種?
    答: 389112種,詳細(xì)解法可看這里
  2. 數(shù)據(jù)庫:唯一約束和主鍵的關(guān)系
  3. 數(shù)據(jù)庫:復(fù)合索引
  4. ARP協(xié)議
  5. 數(shù)據(jù)庫:count()語句用法
  6. *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;
}
```

  1. 數(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。

擴(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)系被傳遞了。

  1. C++上的空類,在32位機(jī)器上,sizeof占多大?
    答案:1
    解析:

    • 實(shí)例化的原因(空類同樣可以被實(shí)例化),每個實(shí)例在內(nèi)存中都有一個獨(dú)一無二的地址,為了達(dá)到這個目的,編譯器往往會給一個空類隱含的加一個字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無二的地址,所以空類所占的內(nèi)存大小是1個字節(jié)。
    • 擴(kuò)展:C和C++編譯器有所不同:
      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++編譯器默認(rèn)分配一個字節(jié)(如果內(nèi)部沒有成員,有,則以成員總空間為主),以便標(biāo)記可能初始化的類的實(shí)例,同時使空類占用的空間也最少(即1字節(jié))。而C編譯器,則給空struct分配0字節(jié)的空間。

      為什么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)的。

  2. 公司局域網(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ū)別

  1. C語言: #pragma.pack(2)代表什么?
    解析:每個特定平臺上的編譯器都有自己的默認(rèn)“對齊函數(shù)”(也稱為對齊模數(shù))#grama.pack(n)其中n可表示你的“對齊系數(shù)”,可?。?(boolean、char的大?。?、2(short的大小)、4(int的大?。?(float,long的大?。?、16(double的大小)
    規(guī)則:
  2. 數(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)行。
  3. 結(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é)對齊的。

二、問答題

  1. 設(shè)計一個“搶紅包”業(yè)務(wù),如現(xiàn)在我有200個鉆石,我把他們分成20份,讓10萬粉絲來搶,問:
  2. 如何設(shè)計鉆石分配算法?
  3. 紅包分?jǐn)?shù)有限,高并發(fā)下怎么解決 固定分?jǐn)?shù)和 限額問題?
  4. 如果高峰階段,搶紅包的并發(fā)請求數(shù)可能達(dá)到8000次/秒,怎樣的存儲系統(tǒng)可支持該方案?
  5. 編程題:a~y 25個字母,用索引表示字母序列,如:a = 1, aa = 2 , aaa = 3, aaaa = 4 ,aaab = 5 …… ,一共有 a 到 yyyy 這么多種字母串,問:設(shè)計一個函數(shù), 輸入一個字母串,如‘a(chǎn)bcd’ ,輸出這個字母串對應(yīng)的索引值?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容