如何动态分配全局 int*?

Posted

技术标签:

【中文标题】如何动态分配全局 int*?【英文标题】:How to allocate a global int* dynamically? 【发布时间】:2019-04-13 21:46:40 【问题描述】:

我正在尝试在 C++ 中执行合并排序代码,为了避免大量内存使用,我想将辅助向量声明为全局变量。您可能知道,使用全局变量策略,使用的空间是 O(1),而使用另一个空间是 O(N logN)。 但是有一个小问题,我不知道将用于测试我的代码的向量的大小,所以我需要动态分配该全局变量。

我已经尝试过这样做:

这是来自 .h 档案:

void mymergesort_recursive(std::vector<int> &v, SortStats &stats, int i = 0, 
                           int f = 0, bool nouveau = true);
int *aux = nullptr;

这是来自 .cpp 存档:

void mymergesort_recursive(std::vector<int> &v, SortStats &stats, int i, 
                           int f, bool nouveau) 
    if (nouveau) 
        stats.recursive_calls = 1;
        f = int(v.size());
        // Allocates the variable aux according with the vector size. This makes a lot of memory economy.

        aux = new int[f];
     else 
        ...
    
    ...

其实我也试过这个:

aux = (int *)malloc(f * sizeof(int));
aux = static cast <int*>(malloc(f * sizeof(int)));

以及所有导致相同错误的其他尝试和错误可能性:-(

`aux'的多重定义

我在这里的这个论坛中寻找了一些其他问题,但是尽管有很多类似的问题,但我无法准确地提取出解决这个问题的方法。

我认为问题已经解释清楚了,但是如果有什么不清楚的地方,请询问。

【问题讨论】:

你没有。使用全局变量比使用原始指针手动动态内存管理更糟糕。 错误不是来自您发布的行。 @tkausl 在错误行是:“ CMakeFiles/labSorttests.dir/src/mymergesort.cpp.o:/home/mypc/Desktop/Lab3/labsort190322_1014/src/mysortfunctions.h:38: 'aux' 的多重定义" 在这个文件的第 38 行,.h,是这样写的:int* aux = nullptr; 典型的合并排序空间开销为 O(n)。自上而下使用 O(log(n)) 堆栈空间,但这不会影响 O(n) 的整体空间复杂度。如下所述,归并排序可以使用⌈n/2⌉空间,但速度会慢一些。 Block merge sort 很稳定,占用 O(1) 空间,但速度慢了 50%。 【参考方案1】:

错误是您在标题上声明了一个变量。

你应该放在标题上

extern int* aux;

然后你应该在一些 .cpp 中输入:

int* aux= nullptr;

无论如何,您应该认真考虑使用std::vector&lt;int&gt; aux; 而不是int* aux

它将为您保留元素数量 空置时几乎不会占用任何空间。 它会根据需要增长。 您可以在使用内存之前reserve内存进行优化。 您无需致电delete/free

【讨论】:

是的,正如有人指出的那样,使用全局变量通常是个坏主意。【参考方案2】:

使用全局辅助向量不会达到 O(1) 的内存空间开销,向量的大小将是您尝试排序的最大向量的大小(或者至少是使用聪明的实现),因此 O(N) 空间开销。

此外,使用全局变量使代码不可重入、非线程安全,并在排序完成后保持开销。

这是一个更好的方法:

编写一个递归mergesort_helper 函数,在合并阶段使用这个临时数组来存储左子数组。 在mergesort 函数中,分配一个大小为(N + 1) / 2 元素的临时数组并将其传递给递归mergesort_helper 函数。 释放临时数组 返回给调用者。

【讨论】:

以上是关于如何动态分配全局 int*?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个分配 C 中动态分配二维数组

如何获取动态分配的二维数组的大小

怎么动态分配指针数组

动态分配指针数组

如何在 C++ 中动态分配数组

分配给设备内存的 CUDA 全局(如 C 语言)动态数组