記錄一下個人在學習過程中碰到的或者想到的各種問題
目錄
- C++标準特性問題
- 關于花括号的構造問題
- 隐式轉換
- 函數模闆
- 現有i++還是先有++i
- STL的問題
- 二分查找
- OOP與GP
- Malloc
- 類型萃取
C++标準特性問題
關于花括号的構造問題
class Base {};
Base b1 = {};
Base b2{};
隐式轉換
第一行代碼顯式構造
第二行代碼用到了兩個隐式轉換,先轉換成
double
,再轉換成
Fraction
第三行代碼用到了一個隐式轉換,轉換成
Fraction
函數模闆
C++98和C++11中函數模闆的差別
如何實作函數模闆的偏特化
現有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
全局
sort
中使用的疊代器指針是要求支援随機通路的(RandomAccessIterator),也就是說該泛型指針支援++操作。而
list
是雙向連結清單,每個節點在記憶體空間上的分布不是連續的,是以不支援使用全局的
sort
方法。
Malloc
malloc
操作具有一定的開銷,其申請的記憶體大小其實略大于程式員要求的大小,因為包含了一定大小的頭部和尾部,成為Cookies,用來記錄一些必要的資訊。是以說,當程式員申請的記憶體空間非常小時,Cookies的占比就會非常的高。若程式員多次申請非常小的記憶體,例如一百萬次,那麼就會産生難以忍受的額外開銷。解決這種問題的方法之一是記憶體池(一次性申請一大塊,然後自己寫一個類來配置設定)
是以假設容器中有一百萬個小元素,那麼使用相應的
allocator
取申請一百萬次記憶體空間,且該
allocator
隻是對
malloc
的簡單包裝,也就是說調用了一百萬次
malloc
,那麼效率會很低,導緻總的Cookies占量非常高。
類型萃取
iterator_traits
的簡單機理實作