gpt4 book ai didi

c++ - HEAP 上的数组分配(单独分配与......连续分配?)

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:22 25 4
gpt4 key购买 nike

在这个答案中:https://stackoverflow.com/a/8547993/5324086

此人用两种方式在 HEAP 上分配数组:

int main(){
const int n = 100000;

#ifdef ALLOCATE_SEPERATE
double *a1 = (double*)malloc(n * sizeof(double));
double *b1 = (double*)malloc(n * sizeof(double));
double *c1 = (double*)malloc(n * sizeof(double));
double *d1 = (double*)malloc(n * sizeof(double));
#else
double *a1 = (double*)malloc(n * sizeof(double) * 4);
double *b1 = a1 + n;
double *c1 = b1 + n;
double *d1 = c1 + n;
#endif
}

这两种分配方式有什么区别?

else 中的第二种方法是否以连续的方式 block 分配?

最佳答案

(我专注于 Linux 的观点;使其适应您的 operating system 和/或编译器实现)

您问题中的代码具有类似 C 语言的外观和感觉。真正的 C++ 将使用 new , 那是在非 ALLOCATE_SEPARATE类似的情况

 double *a1 = new double[4*n];
double *b1 = a1 + n;

如果内存分配失败你会得到一个std::bad_alloc异常。

What is the difference between the two ways of allocation?

ALLOCATE_SEPARATE案例正在对 malloc 进行四次调用.请注意:

  • 每个人 malloc可能会失败,您应该检查一下,例如与

    double *a1 = (double*)malloc(n * sizeof(double));
    if (!a1) { perror("malloc a1"); exit (EXIT_FAILURE); };

    假设您需要一些 C 代码。和 malloc 可以失败,例如当内核无法提供更多虚拟内存时,例如因为mmap(2)失败,已达到某些限制(参见 getrlimit(2) ...),交换空间已耗尽(禁用内存过量使用),等等......阅读有关 paging 的信息& page cache ,以及 malloc(3) 的手册页,尤其是它的NOTES 部分....顺便说一句,您的计算机的资源有限,因此它们可能会溢出。在便宜的笔记本电脑上,您将无法成功 malloc 2015 年 10 TB 的内存(并可靠地使用内存区域)。当然对于 n = 100000 malloc 通常会成功。

  • 在实践中 malloc如果您要求大量 内存(千兆字节),可能会失败,但某些操作系统有 memory overcommitment (我个人不喜欢这个功能并在我的 Linux 系统上禁用)并给你一些指示,即使没有足够的空间用于巨大的内存区域

  • 在不太可能的情况下 n * sizeof(double)溢出size_t ,灾难就会发生。

ALLOCATE_SEPARATE正在询问 malloc(n * sizeof(double) * 4)这可能会溢出较小的值 n (在实践中仍然非常大)。 * 4是必需的,因为我们要求有足够的空间来容纳四个不同的非 aliasing pointers以及它们不重叠的内存区域。

Is the second method in else block allocating in a contiguous manner?

当然可以(正如我所说,对于较小的 n 值可能会溢出或失败,例如当 n * sizeof(double) * 4 在 32 位 Linux(即 Android)平板电脑上的 n * 32 大于例如3 GB,甚至可能是 1 GB。

实际上,您应该使用 C++11 containers和代码:

#include <vector>
int main(){
const int n = 100000;
std::vector<double> vec(n);

vector 的数据将位于堆中,vec 的析构函数会释放它。

当然,heap数据分配在 address space 中的 virtual memory你的process (在 Linux 上,可能使用 mmap(2) - 或有时使用 sbrk - syscall )。

关于c++ - HEAP 上的数组分配(单独分配与......连续分配?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32580386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com