【发布时间】:2017-04-26 04:36:34
【问题描述】:
我有以下类型:
std::vector<std::vector<int>> indicies
其中内部向量的大小始终为 2。问题是,向量在内存中是不连续的。我想用一些连续的东西替换内部向量,以便我可以投射扁平数组:
int *array_a = (int *) &(a[0][0])
如果新类型有 [] 运算符就好了,这样我就不必更改整个代码。 (如有必要,我也可以自己实现)。我的想法是:
std::vector<std::array<int, 2>>
或
std::vector<std::pair<int, int>>
这些在内存中看起来如何?我写了一个小测试:
#include <iostream>
#include <array>
#include <vector>
int main(int argc, char *argv[])
{
using namespace std;
vector<array<int, 2>> a(100);
cout << sizeof(array<int, 2>) << endl;
for(auto i = 0; i < 10; i++){
for(auto j = 0; j < 2; j++){
cout << "a[" << i << "][" << j << "] "
<<&(a[i][j]) << endl;
}
}
return 0;
}
导致:
8
a[0][0] 0x1b72c20
a[0][1] 0x1b72c24
a[1][0] 0x1b72c28
a[1][1] 0x1b72c2c
a[2][0] 0x1b72c30
a[2][1] 0x1b72c34
a[3][0] 0x1b72c38
a[3][1] 0x1b72c3c
a[4][0] 0x1b72c40
a[4][1] 0x1b72c44
a[5][0] 0x1b72c48
a[5][1] 0x1b72c4c
a[6][0] 0x1b72c50
a[6][1] 0x1b72c54
a[7][0] 0x1b72c58
a[7][1] 0x1b72c5c
a[8][0] 0x1b72c60
a[8][1] 0x1b72c64
a[9][0] 0x1b72c68
a[9][1] 0x1b72c6c
在这种情况下似乎有效。这是标准中的行为还是只是幸运的巧合?有没有更好的方法来做到这一点?
【问题讨论】:
-
我认为问题是:
std::pairs和std::arrays中是否有填充?仅仅std::vector连续存储其元素是不够的。 -
向量的向量不保证连续存储元素。只有对象本身(作为地址的内部向量或正在使用的任何表示形式)被连续存储,而不是每个单独的内部向量数据指针指向的数据。
-
@Wintermute stackoverflow.com/questions/19103244/…
-
我不相信你可以依赖这个:stackoverflow.com/questions/40476058/…