工作準備筆記一
1、堆疊的區別?
堆疊是兩種資料結構,堆是佇列優先,先進先出,堆可以看成一棵樹。棧是先進後出。堆一般由程式設計師分配和釋放,棧是由作業系統自動分配和釋放,存放函式的引數值、區域性變數的值等;
auto,採用堆疊方式分配記憶體,register存放在暫存器,extern所有程式段和函式都可使用,static記憶體中以固定地址存放,整個程式執行中都有效。
在java中堆(heap)記憶體資料區,用來儲存物件的例項,物件在堆中分配號以後會在棧中儲存一個4位元組的堆記憶體地址;棧(stack)JVM的記憶體指令區,java的基本資料型別,java的指令程式碼,常量都儲存在棧中。
2、inline行內函數和巨集
C程式中可以用巨集程式碼提高執行效率,巨集本身不是函式,編譯器處理器用拷貝巨集程式碼方式取代函式呼叫取代函式呼叫,省去了引數壓站、組合語言的CALL呼叫、返回引數、return等過程,提高了速度。使用巨集程式碼的最大缺點是容易出錯,可能產生意想不到的邊際效應,巨集不可以除錯,行內函數可以除錯,函式內聯之後可以通過上下文相關的優化技術對結果程式碼執行更深入的優化。
一下情況不宜使用內聯:內聯程式碼比較長的,會導致執行程式碼膨脹過大,如果函式體出現迴圈或者其他複雜控制結構,執行內聯程式碼將比函式呼叫的開銷大得多。
Google C++中規範中只有當函式只有10行之內時才將其定義為行內函數
3、引用相關知識
引用實際是某一變數的別名,對引用的操作與對應邊變數操作完全一樣。如果想利用引用提高程式效率又要保護傳遞的資料不被改變,就應使用常引用,宣告方式: const 型別識別符號 &引用名=目標變數名。
引用作為函式引數在記憶體中並沒有產生副本,直接對實參操作,一般變數會為形參分配儲存單元,如果傳遞物件還會呼叫複製建構函式,因此,在傳遞引數比較大時,引用會比一般引數效率要高,雖然使用指標作為引數也能達到引用效果,但是,在被調函式中同樣要給形參分配儲存單元,且要重複使用“*指標變數名”來運算,程式閱讀性較差。
如果將“引用”作為函式返回值型別, 型別識別符號 &函式名(形參表){/函式體},這樣在記憶體中不產生被返回值的副本;但是不能返回局變數的引用(會在函式返回後銷燬),不能返回函式內部new分配的記憶體;
引用也是除指標外另一鍾產生多型的手段。意味著,一個基類的引用可以指向它的派生類例項。
4、New delete 與 mallocfree聯絡與區別、輸出檔名及當前行號
都是在堆上進行動態記憶體操作,malloc需要制定記憶體分配的位元組數並且不能初始化物件,new會自動呼叫物件的建構函式。delete會呼叫物件的解構函式,free只是釋放記憶體空間,比呼叫解構函式。
cout<<__FILE__<<endl;cout<<__LINE__<<endl;__FILE__和__LINE__是系統預定義巨集。
5、C++中引用編譯過的C程式碼為什麼要加“extern C”
C++支援函式過載,C不支援函式過載,所以被C++和C編譯過後的名字不同。C只是用函式名來表示,C++支援函式過載所以還需要結合引數來表示,引入“extern c”用來解決函式命名不匹配問題;
下面解釋下extern關鍵字,用以表示變數或函式定義在別的檔案中,提示編譯器在遇到時,在其他模組中尋找定義。
3、Android詢問listview的優化問題
使用Adapter提供的convertView的檢視快取機制,第一次顯示資料的時候,會建立n個cconvertView,當下次需要更新item的時候,adapter會迴圈利用已經建立的convertView。如果載入的圖片過大,可以使用縮圖,還可以使用弱引用WeakReference; 利用viewholder模式
4、Fragement 標籤頁 JNI
5、Android的Sqlite資料庫
第一步MySqlite extends SqliteOpenHelper類,實現裡面建構函式,onCreate(),onUpgrade()方法
MySqlite mysqlite =newMySqlite(this);
SqliteDatabasedb=mysqlite.getWritableDatabase();
6、快取的更新,下載圖片等問題
可以使用Android中的LruCache;
一、二級快取工作機制:所謂二級快取就是,當Android端需要獲取資料比如網上圖片,首先從記憶體中查詢(按值查詢),記憶體中沒有再從磁碟檔案或sqlite中去查詢,或都沒有從網上下載;當獲得來自網路的資料,就以key-value對的方式先快取到記憶體(一級快取),同時快取到檔案或sqlite中(二級快取),同時AsimpleCache是一個輕量級的的cache框架實現二級快取,實際上是ACache的java類。下載地址:https://github.com/yangfuhai/ASimpleCache
7、什麼是多型
多型指同一個實體同時具有多種形式。它是面向物件程式設計(OOP)的一個重要特徵。如果一個語言只支援類而不支援多型,只能說明它是基於物件的,而不是面向物件的。C++中的多型性具體體現在執行和編譯兩個方面。執行時多型是動態多型,其具體引用的物件在執行時才能確定。編譯時多型是靜態多型,在編譯時就可以確定物件使用的形式。多型在c++都是通過虛擬函式實現的,簡單一句話就是允許將子類型別的指標賦值給父類型別的指標;
C++中,實現多型有以下方法:虛擬函式,抽象類,覆蓋,模版(過載與多型無關)。 多型的作用:1.隱藏實現細節,是的程式碼能夠模組化,擴充套件模組及程式碼重用。2.介面重用,保證家族中任一類的例項的屬性正確呼叫。
過載是一個類內的多個同名方法,重寫是子類重寫覆蓋父類的方法。
8、TCP
TCP的連線過程和斷開過程:通過三次握手實現連線
(1)客戶端傳送一個SYN包給伺服器,然後等待應答。
(2)伺服器端迴應給客戶端一個ACK、SYN的TCP資料段。
(3)客戶端收到伺服器的SYN報文,必須再次迴應伺服器端一個ACK確認資料段。
釋放連線(四次揮手)這是由TCP的半關閉(half-close)造成的
(1) 某個應用首先關閉,該端為主動關閉active close。該端的TCP傳送一個FIN
(2) 接收到這個FIN端執行被動關閉passive close,這個FIN由TCP確認。
(3) 一段時間後,接收到檔案結束符的應用程序呼叫close關閉它的套接字併發送FIN
(4) 接收到這個最終的FIN的原發送端TCP確認這個FIN
9、關於SQL的複習
①什麼是儲存過程: 儲存過程是一個預編譯的SQL語句,優點是允許模組化的設計,只需建立一次,以後可以多次呼叫,儲存過程比淡出SQL語句執行要快,可以用一個命令帝鄉來呼叫儲存過程
②觸發器: 是一種特殊的儲存過程,通過事件觸發被執行。強化約束,來維持資料的一致性和完整性,可以跟蹤資料庫內的操作從而不允許未經許可的更新和變化。
③索引:索引就是一種特殊的查詢表,可以提高資料的檢索。缺點是減慢了資料錄入速度,增加了資料庫的尺寸大小
④事務:被繫結在一起作為一個工作單元的SQL語句分組;鎖:可以保證事務的完整性和併發性;檢視:是一種虛擬的表,具有和物理表相同的功能,可以增刪改查,不影響基本表;遊標:是對查詢出來的結果集作為一個單元來有效的處理,可以的定在該單元中的特定行,從結果集的當前行檢索一行或多行
⑤日誌:記錄對資料庫資料的修改,主要是保護資料庫以防止故障,以及恢復資料時使用。
歸檔日誌檔案:重要日誌檔案的離線副本,這些副本可能對於從介質失敗中進行恢復。
10、設計模式
單例模式 要點有三個:某個類只能有一個例項,二是它必須自行建立這個例項,三是它必須自行向整個系統提供這個例項;具體就是單例模式的類只能供私有建構函式,含有一個該類的靜態私有物件,該類提供一個靜態共有的函式用於建立或獲取它本身的靜態私有物件。
享元模式:採用一個共享來避免大量擁有相同內容物件的開銷
簡單工廠模式:又稱為靜態工廠方法模式,通過定義一個專門類來負責建立其他類的例項
#i nclude |
Container Class |
<deque> |
deque |
<list> |
list |
<map> |
map, multimap |
<queue> |
queue, priority_queue |
<set> |
set, multiset |
<stack> |
stack |
<vector> |
vector, vector<bool> |
觀察者模式(Observer):定義了一對多的依賴關係,多個觀察者同時監聽同一物件,當這個主題物件發生變化時,會通知所有觀察者物件,讓他們能夠自動更新自己。
11、開閉原則
開閉原則的核心是:對擴充套件發放,對修改關閉;通過擴充套件的方式來達到軟體的改變,而不修改原有程式碼來實現。
12、STL簡介
STL的重要特點就是資料結構和演算法的分離,另一重要特性它不是面向物件的,STL主要依賴於模板而不是封裝,提供了大量的模板類和函式;右邊的表格為容器;迭代器提供了對一個容器中物件的訪問方法以及物件的範圍。
13、 LINUX下系統呼叫的三種方法及檔案操作方式
一通過glibc提供的庫函式,glibc是Linux下使用的開源的標準c庫,它是GNU釋出的libc庫;二使用syscall直接呼叫;三通過int指令。
Linux下對檔案操作方式有系統呼叫(system call)和庫函式呼叫(Library functions)。系統呼叫實際上是指最底層的一個呼叫,面向的硬體。庫函式呼叫面向的是應用開發,相當於應用程式的api,採用這樣的方式原因有雙緩衝技術的實現、可移植性、底層呼叫本身的一些效能方面缺陷。