#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<float>> func(int M)
{
// res = matrix size MxM
vector<vector<float>> res;
float* buffer = static_cast<float*>(malloc(M * M * sizeof(float)));
res.reserve(M);
for (int i=0; i<M; i ) {
res.emplace_back(buffer i * M, buffer (i 1) * M);
/// res[i] = compute_the_matrix();
}
return res;
}
我需要制作一個vector<vector<float>>用于表示矩陣的函式。但是,它的效率很低,因為行可能位于記憶體中的不同位置,而一個好的矩陣應該將其所有元素都放在一個連續的塊中。
為此,我malloc連續一塊記憶體。然后初始化這個塊的向量。
這種方法安全嗎?當向量被破壞時,它會正確釋放記憶體嗎?我能想到的另一種情況是,如果 中存在例外res[i] = compute_the_matrix();,那么我們就有記憶體泄漏。
編輯:我認為這段代碼執行復制建構式而不是移動建構式,所以這不是我想要的。那么,如何制作一個在記憶體中連續的向量呢?
uj5u.com熱心網友回復:
代碼沒有做你認為的事情。
線
res.emplace_back(buffer i * M, buffer (i 1) * M);
創建一個新std::vector<float>的添加到res. 這std::vector<float>將分配自己的記憶體來保存 range 中資料的副本[buffer i * M, buffer (i 1) * M),這也會導致未定義的行為,因為您從未初始化此 range 中的資料。
因此,最終您根本沒有將獲得的記憶體malloc用于向量。該記憶體只是在函式結束時泄漏。
您根本無法指定 avector<vector<float>>應該使用什么記憶體。根本沒有辦法修改它的分配策略。您可以做的是使用 avector<float>而不是將矩陣條目線性索引在單個向量中,或者您可以使用vector<vector<float, Alloc1>, Alloc2>whereAlloc1并且Alloc2是一些自定義分配器型別,您可以以某種方式指定分配行為,以便存盤布局更接近您的想要(盡管我懷疑后者在這里可以很好地完成,或者值得付出努力而不是僅僅使用線性表示)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/493763.html
