Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;三维数组如何存储在内存中,最快的遍历方式是什么_C++_Performance_Vector_Multidimensional Array - Fatal编程技术网

C++ C/C++;三维数组如何存储在内存中,最快的遍历方式是什么

C++ C/C++;三维数组如何存储在内存中,最快的遍历方式是什么,c++,performance,vector,multidimensional-array,C++,Performance,Vector,Multidimensional Array,我试图理解三维数组是如何存储在内存中的,以及std:vector存储方式之间的区别 这就是我理解它们的存储方式,std::vectors也是这样,不同的是它们充分利用了内存块 [0][0][0]a[0][0][1]a[0][0][2]。。。[0][1][0]a[0][1][1]。。。[1][0][0]a[1][0][1] 我的目标是找到遍历和排列的最有效方法 例如,我有一个数组: v[1000][500][3]; 那么,如何更有效地遍历它呢 是否有任何CL工具可以可视化数组的存储方式?当内存地

我试图理解三维数组是如何存储在内存中的,以及std:vector存储方式之间的区别

这就是我理解它们的存储方式,std::vectors也是这样,不同的是它们充分利用了内存块 [0][0][0]a[0][0][1]a[0][0][2]。。。[0][1][0]a[0][1][1]。。。[1][0][0]a[1][0][1]

我的目标是找到遍历和排列的最有效方法

例如,我有一个数组:

v[1000][500][3];
那么,如何更有效地遍历它呢


是否有任何CL工具可以可视化数组的存储方式?

当内存地址是连续的(例如,符合时间数组a[][])时,遍历多维数组的最有效方法是使用指针。
a[i][j][k]
实际上是
和a[0][0][0]+(i*j*k+j*k+k)
。因此,初始化指向起始地址的指针
p
,然后调用
*(p++)

intmain(){
int a[2][3]={{1,2,3},{4,5,6};
int*p=&a[0][0];

对于(int i=0;i当内存地址是连续的(例如,编译时间数组a[][]),遍历多维数组的最有效方法是使用
a指针
a[i][j][k]
实际上是
和a[0][0][0]+(i*j*k+j*k+k)
。因此,初始化指向起始地址的指针
p
,然后调用
*(p++)

intmain(){
int a[2][3]={{1,2,3},{4,5,6};
int*p=&a[0][0];

对于(int i=0;i您在内存中表示数组的值是连续的,这是正确的。因此初始化为0的int v[2][2][2]如下所示:

[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
就性能而言,您希望访问彼此尽可能接近的数据,以避免数据缓存未命中,因此首先在最外层维度上进行迭代是一件好事,因为它们彼此相邻

在第一个示例中可能会发生的情况是,编译器可能会优化内部循环(如果满足正确的条件)并展开它,这样就可以通过跳过分支来节省时间

因为您的两个示例都已经以正确的方式进行了迭代,所以我要说对其进行分析,看看哪个更快



std::vector还将其元素连续存储在内存中,但由于它是一维的,因此默认情况下会应用局部性(前提是您没有随机迭代)。vector的好的一面是它们可以增长,而数组不能(无论如何都会自动地)增长。

您在内存中表示数组的值是连续的。因此int v[2][2][2]初始化为0时,将如下所示:

[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]
就性能而言,您希望访问彼此尽可能接近的数据,以避免数据缓存未命中,因此首先在最外层维度上进行迭代是一件好事,因为它们彼此相邻

在第一个示例中可能会发生的情况是,编译器可能会优化内部循环(如果满足正确的条件)并展开它,这样就可以通过跳过分支来节省时间

因为您的两个示例都已经以正确的方式进行了迭代,所以我要说对其进行分析,看看哪个更快


std::vector还将其元素连续存储在内存中,但由于它是一维的,因此默认情况下会应用局部性(前提是您不是随机迭代)。vector的优点是它们可以增长,而数组不能(自动地)增长。

为了使其可见:

#include <iostream>

    int main()
    {
        int a[][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
        int* p = reinterpret_cast<int*>(a);
        for(unsigned i = 0; i < 6; ++i) {
            std::cout << *(p + i);
        }
        std::cout << std::endl;
        return 0;
    }
#包括
int main()
{
INTA[][3]={{0,1,2},{3,4,5};
int*p=重新解释(a);
for(无符号i=0;i<6;++i){
std::cout使其可见:

#include <iostream>

    int main()
    {
        int a[][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
        int* p = reinterpret_cast<int*>(a);
        for(unsigned i = 0; i < 6; ++i) {
            std::cout << *(p + i);
        }
        std::cout << std::endl;
        return 0;
    }
#包括
int main()
{
INTA[][3]={{0,1,2},{3,4,5};
int*p=重新解释(a);
for(无符号i=0;i<6;++i){

你说的三维向量是什么意思?三维a[10][20][30]这仍然是一个数组。在你的问题中,你区分了3D数组和3D向量。所谓向量,我的意思是在一个内存块中存储多个元素。例如,在数组中,一个元素存储在一个内存块中,但在一个内存块中的向量中,根据内存块的数据类型和大小存储多个元素ks.我想知道向量元素在内存中的存储顺序是否与数组元素的存储顺序相同,以及遍历它的最有效方式是什么。请编辑您的问题以指定您的意思。并指定您是否在谈论std::vector,因为std::vector只能是一维。3D vector是什么意思?三维nal a[10][20][30]这仍然是一个数组。在你的问题中,你区分了3D数组和3D向量。所谓向量,我的意思是在一个内存块中存储多个元素。例如,在数组中,一个元素存储在一个内存块中,但在一个内存块中的向量中,根据内存块的数据类型和大小存储多个元素ks.我想知道向量元素在内存中的存储顺序是否与数组元素的存储顺序相同,以及遍历它的最有效方式是什么。请编辑您的问题以指定您的意思。并指定您是否在谈论std::vector,因为std::vector只能是一维。并声明v[3][500][1000]成为一个3*500*1000字节的连续内存。因此,它在内存中是相同的东西。在两种解决方案中,操作数将是相同的。声明v[3][500][1000]将成为一个3*500*1000字节的连续内存。因此,它在内存中是相同的东西。在两种解决方案中,操作数将是相同的。
#include <iostream>

    int main()
    {
        int a[][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
        int* p = reinterpret_cast<int*>(a);
        for(unsigned i = 0; i < 6; ++i) {
            std::cout << *(p + i);
        }
        std::cout << std::endl;
        return 0;
    }