天天看點

C++問題少年系列

記錄一下個人在學習過程中碰到的或者想到的各種問題

目錄

  • ​C++标準特性問題​
  • ​​關于花括号的構造問題​​
  • ​​隐式轉換​​
  • ​​函數模闆​​
  • ​​現有i++還是先有++i​​
  • ​STL的問題​
  • ​​二分查找​​
  • ​​OOP與GP​​
  • ​​Malloc​​
  • ​​類型萃取​​

C++标準特性問題

關于花括号的構造問題

class Base {};

Base b1 = {};
Base b2{};
      
C++問題少年系列

隐式轉換

C++問題少年系列

第一行代碼顯式構造

第二行代碼用到了兩個隐式轉換,先轉換成​

​double​

​,再轉換成​

​Fraction​

第三行代碼用到了一個隐式轉換,轉換成​

​Fraction​

函數模闆

C++98和C++11中函數模闆的差別

C++問題少年系列
C++問題少年系列

如何實作函數模闆的偏特化​

現有i++還是先有++i

// 前置++
ListNodeIterator& operator++()
{
    node = node->nextNode;
    return *this;
}

// 後置++
ListNodeIterator operator++(int)
{
    // 調用到拷貝構造函數 進行一次預設的淺拷貝 故需要自行書寫拷貝構造函數 同時該拷貝構造函數不能為explicit
    ListNodeIterator temp = *this;
    // ListNodeIterator temp(*this); // 兩種寫法
    operator++();
    // ++(*this); // 兩種寫法
    return temp;
}
      

從這種寫法來看的話應該是先有​

​++i​

​,并且​

​++i​

​的開銷更小,不需要建構一個臨時變量。是以在​

​for​

​循環裡頭一般寫​

​++i​

STL的問題

二分查找

OOP與GP

C++問題少年系列

全局​

​sort​

​中使用的疊代器指針是要求支援随機通路的(RandomAccessIterator),也就是說該泛型指針支援++操作。而​

​list​

​是雙向連結清單,每個節點在記憶體空間上的分布不是連續的,是以不支援使用全局的​

​sort​

​方法。

Malloc

​malloc​

​操作具有一定的開銷,其申請的記憶體大小其實略大于程式員要求的大小,因為包含了一定大小的頭部和尾部,成為Cookies,用來記錄一些必要的資訊。是以說,當程式員申請的記憶體空間非常小時,Cookies的占比就會非常的高。若程式員多次申請非常小的記憶體,例如一百萬次,那麼就會産生難以忍受的額外開銷。解決這種問題的方法之一是記憶體池(一次性申請一大塊,然後自己寫一個類來配置設定)

是以假設容器中有一百萬個小元素,那麼使用相應的​

​allocator​

​取申請一百萬次記憶體空間,且該​

​allocator​

​隻是對​

​malloc​

​的簡單包裝,也就是說調用了一百萬次​

​malloc​

​,那麼效率會很低,導緻總的Cookies占量非常高。

類型萃取

​iterator_traits​

​的簡單機理實作

C++問題少年系列

繼續閱讀