考慮下面的代碼,其中分配大小5×3的2D std::vector<std::vector<int> >
並打印各元素的存儲器地址:2d std :: vector連續內存?
#include <iostream>
#include <vector>
int main() {
int n = 5, m = 3;
std::vector<std::vector<int> >vec (n, std::vector<int>(m));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
std::cout << &(vec[i][j]) << " ";
}
std::cout << "\n";
}
}
輸出:
0x71ecc0 0x71ecc4 0x71ecc8
0x71ece0 0x71ece4 0x71ece8
0x71ed00 0x71ed04 0x71ed08
0x71ed20 0x71ed24 0x71ed28
0x71ed40 0x71ed44 0x71ed48
當然,對於一個固定的行,每列在內存中都是連續的,但行不是。特別是,每一行在前一行的開始之後是32個字節,但由於每行只有12個字節,這留下了20個字節的間隔。例如,因爲我認爲vectors
分配連續的內存,我會期望第二行的第一個地址是0x71eccc
。爲什麼不是這樣,vector
如何決定給予多少差距?
你爲什麼期待?向量開銷大小不爲0 ... –
如果您希望數據連續,請分配一個大小爲「n * m」的單個向量,然後自己進行偏移量計算。 –
或者使用'std :: array,n>'爲0開銷。如果您需要動態容器,請執行@NeilButterworth建議的操作。 –
user2176127