当您不必使用所有数组时,是否可以在堆中创建一个大型数组?

Is it ok to create a large array in the heap when you aren't necessarily using all of it?

提问人:itsmarziparzi 提问时间:12/12/2022 最后编辑:trincotitsmarziparzi 更新时间:12/18/2022 访问量:132

问:

因此,我正在研究一些编码面试类型问题的解决方案,并且结构中有一个数组

#define MAX_SIZE 1000000

typedef struct _heap {
    int data[MAX_SIZE];
    int heap_size;
}heap;

heap* init(heap* h) {
    h = (heap*)malloc(sizeof(heap));
    h->heap_size = 0;
    return h;
}

这个堆结构后来是这样创建的

heap* max_heap = NULL;
max_heap = init(max_heap);

首先,我希望这是用 C++ 风格而不是 C 编写的,但其次,如果我只是对数组有所了解,我假设它相当于通过更改这样的代码来单独分析数组部分

int* data = NULL;
data = (int*)malloc(1000000 * sizeof(int));

现在在这种情况下,如果您可能只是使用一点点,那么声明具有最大大小的数组是否有任何问题?

我想这归结为一个问题,即当在堆中创建数组时,系统如何阻止内存的那部分?在哪种情况下,系统会阻止您访问属于阵列的内存?如果我不使用太多空间,我不会想要一个巨大的阵列来占用空间。

阵列 c malloc 堆内存

评论

0赞 laenNoCode 12/12/2022
你的问题似乎有点困惑。我有点盲目猜测。我的盲目猜测是,您需要通过保留内存,然后编写自己的 malloc 来制作伪堆分配器以在此空间中保留数据。为了回答你的一个问题,当你在堆上分配空间时,它将被程序保留,但如果你在 linux 上运行,它使用延迟分配(它只在你尝试访问内存页中的数据时映射内存页 (4kiB),而不是在保留它时),所以无论你保留多少数据,你只有在使用它时才会得到它
0赞 Some programmer dude 12/12/2022
如果你的系统有空间,而且在程序的生命周期内,你实际上需要并使用所有这些空间,那么我想说它可能没问题。除此之外,请改用 C++,或根据需要使用 C。std::vectormallocrealloc
0赞 Pavel Stepanek 12/12/2022
根据实现的不同,可以为数组保留一个大空间,但很少映射到该空间。然后,在对未映射到任何内存的地址进行任何访问(读取或写入)时,可以根据需要将其映射到该地址。使用这种技术(延迟分配),分配仅部分使用的大型数组只会浪费内存,而不会浪费实际的内存。要更详细地回答这个问题,您需要指定“您正在使用的 CPU 和操作系统”address spacephysical memoryphysical memoryaddress spaceaddress spacephysical memory
0赞 itsmarziparzi 12/12/2022
@IaenNoCode 不,实际问题与堆无关。(我不能分享这个问题本身,因为它是一个韩国网站,而且是韩文翻录)只是这个人发布的解决方案使用了这种数据结构。我在 python 中编写了一个(低效)解决方案,该解决方案仅使用数组来保存一些数据。从空数组开始,仅使用 append、insert 和 pop 在需要或不需要更多数据时动态更改数组大小。
2赞 BoP 12/12/2022
@itsmarziparzi - “此人发布的解决方案” 我们知道,在互联网上发布内容不需要任何资格。我敢打赌,发布“面试解决方案”的人不是超级专家,而是比你懂得少 C++ 的新手。所以,如果它看起来很奇怪,它可能就是这样。

答:

0赞 chux - Reinstate Monica 12/12/2022 #1

如果您可能只是使用其中的一小部分,那么声明具有最大大小的数组是否有任何问题?

是的。分配大小越大,内存不足错误的风险就越大。如果不在这里,则在代码中的其他地方。

然而,一些内存分配系统可以很好地处理这个问题,因为真正的内存分配不会立即发生,而是在需要时稍后发生。

我想这归结为一个问题,即当在堆中创建数组时,系统如何阻止内存的那部分?

这是一个 C 未定义的实现定义问题。它可能会立即发生或推迟发生。

为了获得最大的可移植性,代码将采用更保守的方法,仅在需要时分配大型内存块,而不是依赖于以延迟方式发生的物理分配。


另类

在 C 中,考虑具有灵活成员数组的 a。struct

typedef struct _heap {
  size_t heap_size;
  int data[];
} heap;