- 當把一個派生類對象賦給一個基類對象時,會發生對象切割問題
CShape *pShape=new CShape();
*pShape=rect;//對象切割
pShape=▭//多態實現,
- Class 對象作參數時,用reference to const替換pass by value可避免對象切割
-
多態的實現是通過指針和引用;而對象的轉換只會造成對象切割,不能實現多態。
- 通過設置weak_ptr可以解決類之間使用shared_ptr產生的循環引用問題
5.類的前向聲明將文件間的編譯依存關系降低
-
???類或結構體的前向聲明只能用來定義指針對象或引用:
因為編譯到這里時還沒有發現定義,不知道該類或者結構的內部成員,沒有辦法具體的構造一個對象,所以會報錯;
當需要使用被聲明的類的成員函數或變量時,應當包含其頭文件
- 在類的頭文件定義中,若實現了其成員函數,會隱喻聲明為內聯函數,由編譯器在編譯過程中進行inlining.
- 大多數環境下是在編譯過程中進行inlining
- 某些構建環境下可以在連接期進行inlining
- 還有可以在運行期進行inlining的
- 在遞歸函數中,當傳遞參數時(劍指offer 34.二叉樹中和為某一值的路徑 38.字符串的排列):
- 如果選擇傳引用參數,需要復值
- 如果選擇傳值參數,不需要復值
-
關于STL中的greater<T>()和less<T>()
兩個函數的頭文件是<functional>
- 建堆的時候,默認是大根堆,第三個參數用greater<T>會變成小根堆;
- 排序的時候,默認是從小到大,但是第三個參數用greater<T>會變成從大到小
另外說一句,make_heap等heap操作函數在頭文件<algorithm>里
-
spurious wakeups(虛假喚醒)
// wait端
pthread_mutex_lock(mtx);
while(deque.empty())
pthread_cond_wait(...);
deque.pop_front();
pthread_mutex_unlock(mtx);
// signal端
pthread_mutex_lock(mtx);
deque.push_back(x);
pthread_cond_signal(...);
pthread_mutex_unlock(mtx);
在wait端必須使用while來等待條件變量而不能使用if語句,原因在于spurious wakeups,即虛假喚醒。
虛假喚醒很容易被人誤解為:如果有多個消費者,這些消費者可能阻塞在同一位置。當生產者通知not empty時,duque立即被第一個被喚醒的消費者清空,則后面的消費者相當于時被虛假喚醒了。
虛假喚醒
-
snprintf sprintf
#include <stdio.h>
int main()
{
char data1[10];
char data2[10];
int ret1, ret2;
ret1 = sprintf(data1, "My name is Messi, I'm %d years old!", 28);;
printf("%s\n", data1);
ret2 = snprintf(data2, sizeof(data2), "My name is Messi, I'm %d years old!", 28);
printf("%s\n", data2);
printf("ret1=%d, ret2=%d\n", ret1, ret2);
return 0;
}
運行結果:
結論:
sprintf進行處理時不會進行越界判斷,如果欲寫入的字符串長度大于等于字符數組長度,
會直接對之后的內存進行覆蓋,極不安全。
snprintf則會考慮到字符數組的長度,若字符數組長度為n字節,則最多寫入n-1字節,然后再在后面加上'\0'。
不會越界操作,這也是其被作為sprintf的替代函數的理由。
sprinf返回的是實際寫入的字符串長度。
snprintf返回的是欲寫入的字符串長度。
-
static function 靜態函數
sort(vec.begin(), vec.end, cmp) //cmp是靜態函數
非靜態成員函數是依賴于具體對象的,而std::sort這類函數是全局的,因此無法再sort中調用非靜態成員函數。靜態成員函數或者全局函數是不依賴于具體對象的, 可以獨立訪問,無須創建任何對象實例就可以訪問
-
在函數參數后添加 _ _ attribute _ _ ((noinline))來防止函數inline展開
-
編寫高性能多線程程序必知必會
- false sharing
- CPU cache
-
在處理STL里面的容器的時候,盡量不要自己寫循環。
傳引用,傳遞的是實參本身,而不是實參的一個拷貝,形參的修改就是實參的修改。相比于傳值,傳引用的好處是省去了復制,節約了空間和時間