當一個C++函數接受一個std::vector
參數,該通常模式是通過const
引用傳遞它,如:STD的高效傳遞::矢量
int sum2(const std::vector<int> &v)
{
int s = 0;
for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
return s;
}
我相信,這種代碼產生雙解除引用的時候向量元素被訪問,因爲CPU應該首先解引用v
來讀取指向第一個元素的指針,該指針需要再次解除引用才能讀取第一個元素。我期望在棧上傳遞矢量對象的淺拷貝會更有效率。這種淺拷貝將封裝一個指向第一個元素的指針,並且指針的大小與原始矢量所指向的內存區域相同。
int sum2(vector_ref<int> v)
{
int s = 0;
for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
return s;
}
類似的性能,但通過傳遞隨機訪問迭代器對可以實現更少的便利。 我的問題是:這個想法有什麼缺陷?我認爲應該有一些很好的理由,聰明人接受支付向量引用的性能成本,或者處理迭代器的不便。
編輯:基於下面的評析,請考慮這種情況,如果我只是建議vector_ref
類重命名爲片或範圍。目的是使用具有更自然語法的隨機訪問迭代器對。
你真的比較過兩種情況下生成的機器碼嗎?或者衡量表現? –
您是否檢查過它在組裝中的確如此?我也不認爲迭代器對的約定來自性能考慮因素,它是設計決策(事實上,即使我沒有研究過它們的工作原理,實際上提高了迭代器範圍對象的更方便的概念)。 – UncleBens
我不認爲你的意見實際上是有道理的。引用是對象的別名。因此,訪問對象的引用並不像訪問原始對象那樣昂貴。如果你已經完成了兩分鐘的盡職調查,你就不需要這篇文章,這個稍微煽動性的謾罵就是你的猜測。 –