語言經驗

  1. 當把一個派生類對象賦給一個基類對象時,會發生對象切割問題

          CShape *pShape=new CShape();

          *pShape=rect;//對象切割

          pShape=▭//多態實現,
  1. Class 對象作參數時,用reference to const替換pass by value可避免對象切割
  2. 多態的實現是通過指針和引用;而對象的轉換只會造成對象切割,不能實現多態。
  3. 通過設置weak_ptr可以解決類之間使用shared_ptr產生的循環引用問題

5.類的前向聲明將文件間的編譯依存關系降低

  1. ???類或結構體的前向聲明只能用來定義指針對象或引用:

因為編譯到這里時還沒有發現定義,不知道該類或者結構的內部成員,沒有辦法具體的構造一個對象,所以會報錯;
當需要使用被聲明的類的成員函數或變量時,應當包含其頭文件

  1. 在類的頭文件定義中,若實現了其成員函數,會隱喻聲明為內聯函數,由編譯器在編譯過程中進行inlining.
  • 大多數環境下是在編譯過程中進行inlining
  • 某些構建環境下可以在連接期進行inlining
  • 還有可以在運行期進行inlining的
  1. 在遞歸函數中,當傳遞參數時(劍指offer 34.二叉樹中和為某一值的路徑 38.字符串的排列):
  • 如果選擇傳引用參數,需要復值
  • 如果選擇傳值參數,不需要復值
  1. 關于STL中的greater<T>()和less<T>()

兩個函數的頭文件是<functional>

  • 建堆的時候,默認是大根堆,第三個參數用greater<T>會變成小根堆;
  • 排序的時候,默認是從小到大,但是第三個參數用greater<T>會變成從大到小
    另外說一句,make_heap等heap操作函數在頭文件<algorithm>里
  1. 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立即被第一個被喚醒的消費者清空,則后面的消費者相當于時被虛假喚醒了。

虛假喚醒

  1. 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返回的是欲寫入的字符串長度。

  1. static function 靜態函數
sort(vec.begin(), vec.end, cmp)  //cmp是靜態函數

非靜態成員函數是依賴于具體對象的,而std::sort這類函數是全局的,因此無法再sort中調用非靜態成員函數。靜態成員函數或者全局函數是不依賴于具體對象的, 可以獨立訪問,無須創建任何對象實例就可以訪問

  1. 在函數參數后添加 _ _ attribute _ _ ((noinline))來防止函數inline展開
  2. 編寫高性能多線程程序必知必會
    1. false sharing
    2. CPU cache
  3. 在處理STL里面的容器的時候,盡量不要自己寫循環。
  4. 傳引用,傳遞的是實參本身,而不是實參的一個拷貝,形參的修改就是實參的修改。相比于傳值,傳引用的好處是省去了復制,節約了空間和時間

傳引用節約時間和空間!!!!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.C和C++的區別?C++的特性?面向對象編程的好處? 答:c++在c的基礎上增添類,C是一個結構化語言,它的重...
    杰倫哎呦哎呦閱讀 9,722評論 0 45
  • 1. 讓自己習慣C++ 條款01:視C++為一個語言聯邦 為了更好的理解C++,我們將C++分解為四個主要次語言:...
    Mr希靈閱讀 2,864評論 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,541評論 1 51
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,145評論 1 32
  • 《書都不會讀,你還想成功》是韓國二志成,鄭會一寫的一本書。這本書寫了一個時裝公司職員的經歷:工作中不被領導重視、業...
    樓頂上的小螞蟻閱讀 194評論 2 3