1.記憶體洩露 2.volatile 3.前後++與小括號的關係 4.派生類中基類建構函式、成員中其他類物件的建構函式、派生類自己的建構函式執行順序 5.建構函式和析構函式能否為虛函式 6.字元變數賦值 7.utf-16和utf-8 8.類中例項化其他類物件時,其他類建構函式的順序 9.異或^:滿足交換律和結合律 10.關係代數中五種基本運算 11.重複抽樣與不重複抽樣的抽樣平均誤差大小12.關於浮點數字操作和邏輯操作 13.拷貝函式的建構函式 14.this指標問題 15.read()不是庫函式,是系統呼叫 16.分支限界法 是對回溯法做出優化 17.列舉變數
1.記憶體洩露
記憶體洩漏也稱作「儲存滲漏」,用動態儲存分配函式動態開闢的空間,在使用完畢後未釋放,結果導致一直佔據該記憶體單元。直到程式結束。(其實說白了就是該記憶體空間使用完畢之後未**)即所謂記憶體洩漏。
記憶體洩漏形象的比喻是「作業系統可提供給所有程序的儲存空間正在被某個程序榨乾」,最終結果是程式執行時間越長,占用儲存空間越來越多,最終用盡全部儲存空間,整個系統崩潰。所以「記憶體洩漏」是從作業系統的角度來看的。這裡的儲存空間並不是指物理記憶體,而是指虛擬記憶體大小,這個虛擬記憶體大小取決於磁碟交換區設定的大小。由程式申請的一塊記憶體,如果沒有任何乙個指標指向它,那麼這塊記憶體就洩漏了。
2.volatile
volatile的作用是: 作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.
簡單地說就是防止編譯器對**進行優化.比如如下程式:
xbyte[2]=0x55;
xbyte[2]=0x56;
xbyte[2]=0x57;
xbyte[2]=0x58;
對外部硬體而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器卻會對上述四條語句進行優化,認為只有xbyte[2]=0x58(即忽略前三條語句,只產生一條機器**)。如果鍵入volatile,則編譯器會逐一的進行編譯並產生相應的機器**(產生四條**)。
3.前後++與小括號的關係
int a=3,b=5;
printf("%d",(a++)*++b);/*或者是printf("%d",a++*++b); 結果都是一樣的,前後自增不會受小括號的影響*/
4.派生類中基類建構函式、成員中其他類物件的建構函式、派生類自己的建構函式執行順序:先執行基類的建構函式(如果基類中有虛基類,則先執行虛基類的建構函式,其他基類則按照派生類宣告的先後順序執行),然後是成員中其他類物件的建構函式,最後是派生類自己的建構函式
5.建構函式和析構函式能否為虛函式
建構函式不可以為虛函式,而析構函式可以為虛函式,原因如下:
析構函式不可為虛函式的原因:虛函式的呼叫,需要虛函式表指標,而虛函式表指標是存放在物件的記憶體空間的,如果建構函式為虛函式,此時物件還沒有被建立,何談物件記憶體空間的分配,因此無法呼叫虛函式——虛建構函式。
析構函式可以為函式,而且一般推薦使用虛函式,原因如下:如果採用基類的指標或引用方式呼叫子類時,如果不將基類的析構函式設定為虛函式,容易造成記憶體洩露,舉例說明:
a *p=new b;//b是繼承a的派生類
delete p;
i.如果基類a的析構函式不設定為虛函式,那麼delete p時,僅會呼叫a的析構函式,釋放b中a的不分,而b新多出來的部分則不會被釋放,這樣就可能會造成記憶體洩露;
ii.如果將基類a的析構函式設定為虛函式,那麼在delete p時,會先呼叫基類b的析構函式,然後呼叫基類a的析構函式,這樣就不會出什麼問題。這樣等同於如下**,也是先呼叫派生類b的析構函式,然後呼叫a的析構函式:
b *p=new b;
delete p;
6.字元變數賦值
char a='\82';
printf("a=%c",a);
輸出是a=2,為什麼是2呢?首先,\0oo:八進位制值(o表示乙個八進位制數),顯然這裡不是八進位制數,\xhh:十六進製制值(h表示乙個十六進製制數字),這裡也不是,so,\82只能代表三個字元 \、8、2,又因為賦值是從右往左進行的,最先掃瞄到的就是2,所以a的值就是2,輸出為a=2;
7.utf-16和utf-8
utf-16 固定表示兩個位元組表示乙個字元,不管是字母還是漢字; utf-8 使用 1- 3 個位元組表示乙個字元,根據儲存的內容不同而不同。如果儲存的漢字多,使用 utf-16 占用字元數雙倍的空間,使用 utf-8 占用字元數三倍的空間;如果儲存的英文本母多,使用 utf-16 使用字元數雙倍的空間,使用 utf-8 使用字元數相同的空間。
更詳盡的介紹見:
8.類中例項化其他類物件時,其他類建構函式的順序:先執行該類的建構函式,然後呼叫其他類的建構函式,呼叫順序是按照其他類定義物件的先後順序,而不是傳引數的順序,其他例項如果需要傳引數初始化,則該類的建構函式必須進行顯示的對物件進行初始化,如下:
class printer
};class container
printer a;
printer b;
};int main()
輸出一直都是:ab!
9.異或^:滿足交換律和結合律
例如:x^(x^y)=x^x^y=y,y^(x^y)=y^x^y=y^y^x=x。
10.關係代數中五種基本運算
五種基本關係代數運算:並(∪)、差(—)、笛卡爾積(x)、投影(σ)、選擇(π);
並(∪):兩個關係需要有相同的關係模式,並的物件是元祖,由兩個關係所有元祖構成,r∪s=
差(—):同樣,兩個關係有相同的模式,r和s的差是由屬於r,但不屬於s的元祖構成的集合。r—s=;
笛卡爾積(x):對兩個關係r和s進行操作,產生的關係中,元祖個數為兩個關係中元祖個數之積,r×s≡ ;
投影(σ):對關係進行垂直分割,消去某些列,並重新安排列的順序;
選擇(π):根據某些條件關係,作水平分割,即選擇符合條件的元祖。
11.重複抽樣與不重複抽樣的抽樣平均誤差大小
12.關於浮點數字操作和邏輯操作
浮點數不允許直接進行移位,但可以通過間接的進行,例如,將float型資料取位址後,強制轉化為整型(int/unsigned int/long等)送給該型別指標,然後用取值操作符(*)將值賦給對應的整型變數,下面就能對該整型變數進行位操作了。
【注】對浮點型資料移位意義不大,因為浮點型資料在記憶體中分三部分表示:符號位(1)、階數(8)、尾數部分(23),這裡給出的是float型在32位作業系統的儲存方式,進行左右移位操作時,移位後的資料,與原始資料沒有任何意義。
邏輯運算子:非(!)、與(&&)、或(||),操作物件可以是任何型別資料
13.拷貝函式的建構函式
拷貝建構函式的形參不限制為const,但是必須是乙個引用,以傳位址方式傳遞引數,否則導致拷貝建構函式無窮的遞迴下去,指標也不行,本質還是傳值。
14.this指標問題
this指標是乙個const修飾的常指標,不能夠被修改。
如果有乙個類myclass如下:
~myclass()
上面的**無法通過編譯,原因就是,delete this錯誤,this指標不能夠被修改;假設上面**能通過編譯,則delete運算子被執行時,首先會呼叫析構函式,然後再釋放記憶體,這樣會再次呼叫~myclass,依然發生錯誤。
15.read()不是庫函式,是系統呼叫,作用是讀檔案(linux中的一切裝置都看做檔案)
函式原型:
ssize_t read(int filedes, void *buf, size_t nbytes);
returns:number of bytes read, 0 if end of file, -1 on error
如果read系統呼叫成功,則將返回讀取到的位元組數;如果遇到了檔案尾eof,則返回0。
16.分支限界法 是對回溯法做出優化。feasible(s,x)是剪枝函式。
s=s+; c=c-;是回溯(分支)過程
method
(c);
while(not solution(s))
;c=c-;
}return s;
}
17.列舉變數是全域性變數的情況下,列舉值的預設值是0,不是列舉的第乙個值。其他情況,其值是不定的,而且不限定於所列出的列舉值。 C C 瑣碎知識歸納之二
1 malloc 函式 void malloc unsigned int size 在記憶體的動態分配區域中分配乙個長度為size的連續空間,如果分配成功,則返回所分配記憶體空間的首位址,否則返回null,申請的記憶體不會進行初始化。2 calloc 函式 void calloc unsigned ...
person re id一點瑣碎知識
前者是指gallery中每個人的影象為一張 n 1 而後者是指gallery中每個人的影象為n 1張影象,同樣的rank 1下,一般n越大,得到的識別率越高。2.gallery probe和cmc gallery是候選行人庫,probe是待查詢輸入,也叫查詢影象 query cmc是一種reid的效...
fpga mysql FPGA的一些瑣碎知識整理
1.生產fpga的廠家有 altera xilinx atcel lattice ps altera和xilinx主要生產一般用途fpga,其主要產品採用sram工藝 actel主要提供非易失性fpga,產品主要基於反熔絲工藝和flash工藝 ps 熔絲,顧名思義 把絲熔掉,反熔絲技術恰相反,原來斷...