C++ 以正确的方式在堆上声明静态连续多维数组

标签 c++ arrays multidimensional-array heap-memory

声明一个多维数组的正确方法是什么,该数组在运行时在堆上不会改变大小? (理想情况下在 C++11 中,如果某些功能仅在 C++14(而不是 C++17)中可用,我也很想听听它,但很可能它对我不起作用)

到目前为止,我已经浏览了有关该主题的数十个问题和答案,但似乎没有一个能够真正回答它/有些答案与其他答案相冲突。

我发现的以下解决方案以及它们似乎存在的使它们不可行的问题(其中大部分取自SO答案及其评论,所有示例均假设 3D 数组作为目标):

  • 使用 new 声明的普通 [][][] 数组/声明指针数组
    问题:内存中不连续,每个单独的数组在内存中都有其独立的位置

  • 多个 std::arrays/boost::arrays 相互嵌套
    问题:内存中不连续,每个单独的数组在内存中都有其独立的位置

  • 矩阵
    问题:只是 std::array 的容器,基本上同样存在问题

  • 多个 std:vector 相互嵌套
    问题:动态,几乎前面提到的所有其他问题

  • 声明为带有指向普通 [] 数组的指针的单个 block ,然后在运行时使用 GetIndex(array,x,y,z) 等函数通过计算来遍历索引
    问题:这似乎满足了所有要点,但该解决方案似乎不太理想,因为当您需要经常访问/更改元素时,这似乎会带来显着的 CPU 开销

与此有点无关的是,如果这些解决方案在类里面,我也遇到了一些问题,并且我必须使用 .运算符,所以如果有人能够通过正确声明和正确访问堆分配的多维数组作为类成员的示例来告诉我正确的解决方案,我将更加感激。

最佳答案

Normal [][][] array declared with new/declaring an array of pointers Problem: Non-contiguous in memory, every individual array has its independent location in memory

...

Yes, the size is always declared with a #define. – uncanny

是的,C++ 多维数组很棘手,并且非常擅长使 C++ 代码变得不可读。实际上,如果在编译时大小已知,您可以创建静态多维数组,因此您会将其分配为连续的内存块

int main()
{
    int arr[100][200][100]; // allocate on the stack

    return 0;
}

问题是如何在堆上分配它...没问题,只需将它包装成一个结构体,然后在堆上分配这个结构体即可。

#include <memory>

struct Foo
{
    int arr[100][200][100];
};

int main()
{
    auto foo = std::make_unique<Foo>(); // allocate on the heap
    auto& arr = foo->arr;

    arr[1][2][3] = 42;

    return 0;
}

std::make_unique 调用在堆上分配 Foo,并保证内存将被释放。此外,您还可以使用几乎零量的样板代码来访问 Foo 内部和外部的数组。不错!

关于C++ 以正确的方式在堆上声明静态连续多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59082203/

相关文章:

arrays - 将字符串转换为字符数组 swift 2.0

multidimensional-array - 如何确定文本文件中多个矩阵的维数

C++ 遍历多维数组

c++ - 为什么 while 循环会无限重复?

c++ - 指针数组作为函数参数

javascript - knockout JS : Passing observable array as argument

javascript - 在 IE 中排序数组

c++ - 为什么操作系统更改了我的数据包的分配出站端口?

c++ - 用 C++ 将 Unicode 写入文件

java - 有没有更类似于 C 的方法在 Java 中打印 2D 数组?