考虑下面的代码,其中分配大小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