【发布时间】:2020-11-09 09:44:25
【问题描述】:
这更像是一个教育问题,我没有要解决的具体问题。我想了解以下场景中“幕后”发生的事情:
我们有 2 个ints、w 和 h,我们需要一个 0s 的矩阵 (vector<vector<int>>)。有多种方法可以做到这一点,我想知道哪一种表现最好(可能这意味着哪一种表现最少)。
选项 1:
vector<vector<int>> m;
for (int i = 0; i < h; i++)
{
m.push_back(vector<int>());
for (j = 0; j < w; j++)
m[i].push_back(0);
}
选项 2:
vector<vector<int>> m;
for (int i = 0; i < h; i++)
m.push_back(vector<int>(w, 0));
选项 3:
vector<vector<int>> m(h, vector<int>(w, 0));
m.push_back(vector<int>());/m.push_back(vector<int>(w, 0)); 处的临时值是否在内存中创建,然后也复制到m 中?如果不是最好使用选项 1 来最小化复制? (假设我们只讨论更大的数组,比如 1,000,000 x 1,000,000)。选项 3 也面临同样的困境;哪个往往更快(至少在纸面上),为什么会这样?
【问题讨论】:
-
根据
h和w的值,选项 1 和 2 中的向量可能会处理许多内存重新分配。在选项 3 中没有重新分配。对于第一个和第二个选项,push_back将导致临时向量被 移动 并且不被复制(但仍然会有重新分配)。作为改进选项 1 和 2 的一种方法,请改用emplace_back。但“最好”的方式(显示的三个)是选项 3。 -
您提到“副本”,但您认为哪个示例有副本?为什么你认为这很糟糕?
标签: c++ memory memory-management