博客參考:C++中的多態和內部實現:https://www.cnblogs.com/qiaoconglovelife/p/5128523.html
? ? ? ? ? ? ? ? ? ? 虛函數表存放的地址:https://blog.csdn.net/jiary5201314/article/details/52627630
? ? ? ? ? ? ? ? ? ?為什么STL和linux都采用紅黑樹作為平衡樹的實現:https://www.zhihu.com/question/20545708
? ? ? ? ? ? ? ? ? 進程關系:父子進程之間的數據共享:http://blog.sina.com.cn/s/blog_1550922e60102z7gm.html
? ? ? ? ? ? ? ? ?
(1)C++語言中多態的實現:一個接口,多種行為(向不同對象發送同一消息,可以產生不同的行為)
? ? ? ? ? ? ? ? 1)編譯時多態:函數的重載和模板實現,編譯器在編譯的時候,通過實參的個數和類型,選擇最終調用的函數;
? ? ? ? ? ? ? ? 2)運行時多態:通過虛函數實現,基類的某個成員函數為虛函數,派生類又定義一成員函數,除函數體的其余部分都與基類的成員函數相同;
? ? ? ? ? ? ? ? ? ? ? 每一個含有虛函數的類,都會生成虛表(virtual table)。這個表,記錄了對象的動態類型,決定了執行此對象的虛成員函? ?數的時候,真正執行的那一個成員函數。
? ? ? ? ? ? ? ? ? ? ?對于有多個基類的類對象,會有多個虛表,每一個基類對應一個虛表,同時,虛表的順序和繼承時的順序相同。
? ? ? ? ? ? ? ? ? ? 在每一個類對象所占用的內存中,虛指針位于最前邊,每個虛指針指向對應的虛表。
? ? ? ? ? ? ? ? ?3)虛指針存放在內存的哪里:虛函數表是全局共享的一個元素,即全局只有一個,存放在內存的靜態/全局變量區。
? ? ? ? ? ? ? ? ? ? ?函數表類似一個數組,類對象中存儲vptr指針,指向虛函數表.即虛函數表不是函數,不是程序代碼,不肯能存儲在代碼段.。
? ? ? ? ? ? ? ? ? ?.虛函數表存儲虛函數的地址,即虛函數表的元素是指向類成員函數的指針。
(2)STL容器的底層實現:
? ? ? ? ? ? ? 1)map的底層實現用紅黑樹,而不用AVL
? ? ? ? ? ? ? ? ? ? ?a)AVL是一個高度平衡的樹,對樹進行插入和刪除更容易導致樹的unbalance,因此AVL需要rebalance的概率更大,AVL插入最多也只需要兩次旋轉;而紅黑樹插入只要兩次旋轉,刪除至多三次旋轉;雖然使用AVL樹搜索的效率非常穩定,但選取紅黑樹,是一個折中的方案;
? ? ? ? ? ? ? ? ? ? ? b)插入一個節點導致樹的不平衡,AVL和紅黑樹都最多只需要兩次旋轉操作;但刪除節點引起樹的不平衡,最壞情況,AVL需要維護從被刪節點到root這條路徑上所有節點的平衡性,因此旋轉量級為O(logN),而紅黑樹至多需要三次旋轉;
? ? ? ? ? ? ? ? ? ? ? c)紅黑樹在需要大量插入和刪除節點的場景下,效率更高;AVL由于高度平衡,所有搜索的效率更高;
? ? ? ? ? ? ? ? ? ? ? d)map的實現是折中了兩者在搜索,插入,刪除的效率,總體來說紅黑樹更好;
(3)ucos操作系統和linux操作系統的區別
? ? ? ? ? ? 參考博客:ucos ii和linux操作系統的區別:https://blog.csdn.net/chen_geng/article/details/51556459
(4)全局變量在多任務之間可以共享嗎?
? ? ? ? ? ? 1)對于多進程而言(父子進程和兄弟進程):如果其中一方調用了exec族函數(進程的代碼和數據,全部替換,實際使用的物理內存也會重新申請),此時進程的代碼段,數據段和堆棧都是獨立的,沒有任何關系;
? ? ? ? ? ? 2)對于父子進程,其全局變量遵循“讀時共享,寫時獨享”的原則,因此,如果在父子進程中有修改全局變量的情況,系統會再給變化的全局變量分配不同的物理內存;
? ? ? ? ? ? 3)對于不同進程的線程,不能通過全局變量來通信;
? ? ? ? ? ? 4)對于同一進程的線程,可以通過全局變量來銅線的,它們共享進程的代碼段、數據段、BSS段。頁目錄和頁表使用進程的頁目錄和頁表;
(5)進程之間共享的內容有哪些?
? ? ? ? ? ? 1)對于沒有聯系的進程之間的數據是相互獨立的;
? ? ? ? ? ? 2)對于父子進程:相同的地方:全局變量,堆棧,環境變量,用戶id,宿主目錄,進程工作目錄,信號處理方式;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不同的地方:進程id,fork返回值,父進程id,進程運行時間,鬧鐘,未決信號集;
? ? ? ? ? ? ? ? ? ?可以理解成,子進程拷貝了父進程0~3G用戶空間的內容,以及父進程的pcb,但是pid不同,然后再映射到物理內存;
(6)虛擬內存和物理內存的映射
? ? ? ? ? ? 參考博客:虛擬地址和物理地址的轉換:https://blog.csdn.net/a8316124/article/details/56485642? ?