1.C++
空類型的實(shí)例中不包含任何信息氢伟,但是sizeof的值為1粉铐,因?yàn)槁暶髟擃愋偷膶?shí)例時(shí)钩乍,必須在內(nèi)存中占有一定的空間,否則無(wú)法使用這些實(shí)例
在類型中添加一個(gè)構(gòu)造函數(shù)和析構(gòu)函數(shù)画畅,sizeof類型還是為1
因?yàn)檎{(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)只需要知道函數(shù)的地址即可砸琅,而這些函數(shù)的地址只與類型相關(guān),而與類型的實(shí)例無(wú)關(guān)轴踱,編譯器也不會(huì)因?yàn)檫@兩個(gè)函數(shù)而在實(shí)例中添加任何額外的信息如果把析構(gòu)函數(shù)標(biāo)記為虛函數(shù)症脂,則會(huì)在實(shí)例中多存放一個(gè)指向虛函數(shù)表的指針,在32位機(jī)器上,一個(gè)指針占4個(gè)字節(jié)诱篷,在64位機(jī)器上壶唤,一個(gè)指針占8個(gè)字節(jié)
C++標(biāo)準(zhǔn)不允許拷貝構(gòu)造函數(shù)傳遞值類型,因?yàn)閭鬟f值類型棕所,就需要將傳入?yún)?shù)拷貝一份闸盔,就會(huì)無(wú)線循環(huán)調(diào)用拷貝構(gòu)造函數(shù)
2.數(shù)組
數(shù)組是順序存儲(chǔ)結(jié)構(gòu),占據(jù)一塊連續(xù)的內(nèi)存并按順序存儲(chǔ)數(shù)據(jù)橙凳。
- 數(shù)組中的內(nèi)存是連續(xù)的,可以根據(jù)下標(biāo)在O(1)時(shí)間讀寫(xiě)任何元素笑撞,時(shí)間效率很高
- 為了避免數(shù)組空間效率不高岛啸,先為數(shù)組開(kāi)辟較小的空間,然后往數(shù)組添加數(shù)據(jù)茴肥,當(dāng)數(shù)據(jù)的數(shù)目超過(guò)數(shù)組的容量時(shí)坚踩,在重新分配一塊更大的空間,把之前的數(shù)據(jù)復(fù)制到新的數(shù)組中瓤狐,再把之前的內(nèi)存釋放
- 使用動(dòng)態(tài)數(shù)組時(shí)瞬铸,要盡量減少改變數(shù)組容量大小的次數(shù)
- 數(shù)組的名字也是一個(gè)指向數(shù)組第一個(gè)元素的指針,訪問(wèn)數(shù)組元素時(shí)础锐,要防止越界
- 數(shù)組作為函數(shù)的參數(shù)傳遞時(shí)嗓节,數(shù)組就會(huì)自動(dòng)退化為同類型的指針
3.字符串
char str1[]="hello world";
char str2[]="hello world";
char *str3="hello world";
char *str4="hello world";
str1和str2是兩個(gè)字符串?dāng)?shù)組,會(huì)為其分配12個(gè)字節(jié)的空間皆警,并將hello world的內(nèi)容復(fù)制到數(shù)組中去拦宣,這是兩個(gè)初始地址不同的數(shù)組
而str3和str4是兩個(gè)指針,不會(huì)為它們分配內(nèi)存以存儲(chǔ)字符串的內(nèi)容信姓,只要將它們都指向"hello world"在內(nèi)存中的地址就可以了鸵隧,常量字符串再內(nèi)存中只有一個(gè)拷貝,所有它們指向同一個(gè)地址
- C++中的string是通過(guò)短字符串優(yōu)化來(lái)實(shí)現(xiàn)的
- C#中的string是通過(guò)寫(xiě)時(shí)復(fù)制實(shí)現(xiàn)的
4.用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
當(dāng)stack2中不為空時(shí)意推,在stack2棧頂?shù)脑厥亲钕冗M(jìn)入隊(duì)列的元素豆瘫,可以彈出。當(dāng)stack2為空時(shí)菊值,可以把stack1中的元素逐個(gè)彈出并壓入stack2外驱,可以直接彈出,每次插入新的數(shù)據(jù)還是壓入stack1
5.排序算法
- 快速排序在數(shù)組本身已經(jīng)排好序腻窒,每次都是以最后一個(gè)數(shù)組作為比較標(biāo)準(zhǔn)略步,這時(shí)快速排序的效率只有O(n2)