改变静态数组的大小

Changing the size of static array

本文关键字:数组 静态 改变      更新时间:2023-10-16

在代码中声明了如下数组:数组将在堆栈本身上进行处理。我们没有在堆上分配mallocnew的任何内存

char a[20000];

现在我们需要将20kb改为1800000(180kb)。像下图:

char a[1800000];

我们只是用一些数据填充数组。这是一件合理的事情吗?

我们可能面临的问题是什么?我只是担心这个价值似乎太大了。有没有更好的方法来绕过这种需求?

我在solaris unix平台上工作。

像这样声明的变量大小的显著增加可能会影响堆栈。我建议将其替换为std::vector,这将从堆中创建所需的大量内存。毕竟这被标记为C++

这个数组真的是静态的吗?因为没有static关键字。

无论如何,在堆栈上创建这么大的数组是不应该的。根据编译器的不同,你的程序可能会崩溃,根据平台和操作系统的不同,它也可能崩溃。

如果你必须创建这么大的数组,你应该使用C中的malloc()或c++中的new:

char *array = malloc(1800000 * sizeof(*array));

这样更方便携带,也更安全。此外,您不能调整堆栈上的数据大小。所以,使用堆。

HTH,CK

如果您真正指的是"静态",并且这是针对一个相当现代的平台,那么这种大小的静态对象没有问题。在32位平台上,当你进入低gb时,你会开始遇到困难;在64位平台上,唯一的限制是可用的存储容量。

然而,你也说这是在堆栈上,这意味着它是自动的而不是静态的。这可能是一个问题,特别是在多线程程序中,因为堆栈的大小是固定的。因此,您应该避免将大型对象放在堆栈上;如果合适的话,将它们设置为静态,否则设置为动态-在C中使用malloc创建它,并在c++中使用std::vector<char>

在需要支持8位或16位平台的不太可能的情况下,您可能会发现很难或不可能创建大于64kb的对象。在这种情况下,您可能希望将其分成更小的部分(假设您有超过64kb的RAM;否则,从磁带或磁盘保存和加载页面是可能的,但非常慢)。

在此范围内使用Malloc或new。一般来说,堆更适合较大的分配。更容易调整大小。如果您的分配发生在函数作用域中,这将把它放在堆栈上,则尤其如此。如果这些是全局的,就没那么糟糕了。但是,如果可能的话,我仍然坚持使用堆分配。

澄清一些基本概念:

有关键字static和静态存储持续时间,这意味着该变量将在整个程序执行过程中持续存在,并且只会分配一个变量实例。具有静态存储时间的对象存储在RAM中的特定段中,通常称为.bss。所有声明为静态或在文件作用域(全局变量)的变量都具有静态存储时间。C/c++标准保证具有静态存储时间的变量初始化为零。

堆栈是RAM的动态部分,通常在其中分配局部变量和函数参数。在堆栈上分配的变量通常被称为自动,例如,让编译器自动处理该变量并将其分配到最合适的位置,该位置可以在堆栈上,也可以在CPU寄存器,缓存内存等中。在C/c++中有一个关键字叫做auto,但是你不需要使用它:所有的局部变量和参数默认情况下都是自动的。具有自动存储的变量将包含垃圾值,除非显式初始化。

堆是RAM的另一个动态部分,只有当您通过malloc或new显式分配变量时才会使用堆。在讨论动态内存分配(有时也称为自由存储管理)时,通常会提到堆。动态分配的变量将包含垃圾值,除非显式初始化。

在大多数计算机上,静态段和堆仅受您拥有的RAM数量的限制,而堆栈具有固定的有限大小。在像Unix这样的多任务系统上,计算机中的每个进程都有一个堆栈。我不确定Unix/Solaris允许多大的。bss或堆栈,我怀疑这取决于计算机的年龄。较旧的机器在分配1.7MB内存时可能会遇到问题。我不太了解Unix机器,但我认为建议是在堆上动态分配所有如此大量的数据(这就是您在PC上所做的)。

我们只是用一些数据填充数组。这是有效的吗做什么?

是的

我们可能面临的问题是什么?

如果所有的数据访问都基于数组的前面,那么不是很多。如果偏移量是从末尾取的,或者基于一些涉及大小的计算,可能会出现问题。

我只是担心这个值似乎太大了。有吗?有更好的方法绕过这种需求吗?

有更好的方法,但不是因为它的大小。STL容器将是一个好主意。std::vector(例如)可以在运行时根据当前需要调整大小。

在一个正常的程序中,大小是无关紧要的,就拿图像为例,它们容纳了mbs和mbs的数据,有时甚至是gb。如果你的程序在现代计算机上运行,我完全不用担心大小的问题。

你应该考虑将数据封装在一个动态分配的对象中,因为你可以使用realloc(如果使用c)在运行时增加数据的大小。如果做得正确,这也将帮助你隐藏实现细节。