为什么 C/C++ 中数组的缺点"Arrays needs a contiguous block of memory"?

Why "Arrays needs a contiguous block of memory" is the bad point of Arrays in C/C++?

本文关键字:contiguous needs block of memory Arrays 为什么 C++ 数组 缺点      更新时间:2023-10-16

我在很多书中看到这样一句话:C/C++中数组的一个主要问题是:

阵列需要一个连续的内存块

我真的不明白为什么Arrays的这个功能会考虑一个问题?我认为编译器可以管理并为数组分配正确的大小,那么问题出在哪里呢?

当您考虑内存碎片的情况时,您可能无法找到满足整个阵列大小要求的可用内存块。

这在某些分配/释放方案中尤其容易看到,在这些方案中,数千个可变大小的对象被快速分配和释放,这可能会在空闲内存中留下多个漏洞(取决于使用的策略)。在这一点上,对大对象的不合时宜的分配可能无法找到任何可用空间。

碎片整理发生在内存中,然后在尝试分配内存时,可能没有所需的正确大小。

这本身不是问题,但这意味着必须在内存中找到一个连续的块才能为数组获得空间。如果你的记忆力非常分散,这可能很棘手。也就是说,数组必须是连续的,这通常是非常好的,因为这意味着你可以有规律的内存访问,并且可以减少缓存未命中,从而创建缓存友好的代码。

另一方面,现在有一些结构,如链表,其中包含指向其他元素的指针,这意味着它们可以位于内存的不同部分,不必是连续的,但这也意味着,当你试图访问指针时,它可能不会被缓存,因此会出现缓存未命中,从而延迟程序。

连续块之所以是一个重要功能,是因为当您在操作系统中调用函数时,它们通常期望整个缓冲区是一个字节接一个字节。对于您自己的代码来说,这可能不是问题,因为数组实现可以封装对它的访问,这样就可以将多个较小的块呈现给外部,就好像它是不正常的一样。将内存传递给其他函数,而这些函数不知道您的特定实现,这一点不再成立。

另一个较小的问题可能是访问阵列时的性能。